mikrocontroller.net

Forum: Compiler & IDEs Char und funktionen übergabe


Autor: Jens Hause (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ein Problem mit dem Auslesen über SPI.


char * read_from_buffer(unsigned int buffer)
{
char * daten;
dataflash_busy_wait();
flash_on();
flash_1();
if(buffer==1)Write_SPI(0xD4);
if(buffer==2)Write_SPI(0xD6);
Write_SPI(0x00);
Write_SPI(0);
Write_SPI(0);
for(unsigned int c=0; c<528; c++)
  {
    *daten++=Write_SPI(0xFF);
  }

flash_0();
flash_off();
return &daten[0];
}


wenn ich die Funktion aufrufe

mit


char *ergebniss=read_from_buffer(1));
printf(&ergebniss[0]);
dann bekomme ich

†††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††† 
†††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††† 
†††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††††† 
††††††††††††††††††††††††††††††††††††††††‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ 
‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ 
‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ 
‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡‡ 
‡‡‡‡‡‡‡‡ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ 
ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ 
ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ 
ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ 
‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ 
‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ 
‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ 
‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰‰ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ 
ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ 
ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ 
ŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠŠ‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ 
‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ 
‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ 
‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ 
‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹‹ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ 
ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ 
ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ 
ŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒ 
 
 
 
ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ 
ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ 
ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ 
ŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽŽ 
 
 
 
 
 
 
 
‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ 
‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ 
‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘ 
‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘‘’’’’’’’’’’’’’’’’’’’’’’’’ 
’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ 
’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ 
’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ 
’’’’’’’’’’’’’’’’““““““““““““““““““““““““““““““““““““““““““““““““““““““““ 
““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““ 
““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““““ 
““““““““““““““““““““““““““““““““““““““““““““““““““““““““”””””””””””””””” 
”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””” 
”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””” 
”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””” 
””””””””””””””””””””””””•••••••••••••••••••••••••••••••••••••••••••••••• 
•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 
•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• 
••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••–––––––– 
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 
––––––––––––––––––––––––––––––––———————————————————————————————————————— 
———————————————————————————————————————————————————————————————————————— 
———————————————————————————————————————————————————————————————————————— 
———————————————————————————————————————————————————————————————————————— 
˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ 
˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ 
˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜ 
˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜˜™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ 
™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ 
™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ 
™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™™ 
™™™™™™™™šššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššššš 
ššššššššššššššššššššš
Wenn ich

char * read_from_buffer(unsigned int buffer)
{
char * daten;
dataflash_busy_wait();
flash_on();
flash_1();
if(buffer==1)Write_SPI(0xD4);
if(buffer==2)Write_SPI(0xD6);
Write_SPI(0x00);
Write_SPI(0);
Write_SPI(0);
for(unsigned int c=0; c<528; c++)
  {
    printf("%c",=Write_SPI(0xFF));
  }

flash_0();
flash_off();
return &daten[0];
}

und den aufruf

read_from_flash(1);

dann bekomme ich

"Hallo wie gehts!!!"

genau das was ich in den Flash geschrieben habe.

wie kann ich lösen????

Danke

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und Du glaubst wirklich, jemand könnte in Deinen Kopf schauen ?

Der Kode ist total uncompilierbar, er strotzt nur so vor unbekannten 
Funktionen und fehlenden Includes / Deklarationen.

Kommentare, Funktionsbeschreibung fehlen völlig.

Und die Hardware (Schaltung, CPU), kennt auch keiner.


So ist Dir nicht zu helfen !!!


Peter

Autor: Jens Hause (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir geht es eigendlich nur um den aufruf der Funktion


aufruf der Funktion:
??????? read_from_buffer(1);


was kommt bei ?????? rein

char * ergebniss=read_from_buffer(1);
char ergebniss[529]=read_from_buffer(1);

oder ???

das ist mein Problem.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir nochmal gründlich im C-Buch an, was Pointer und was Arrays 
sind.

Pointer dürfen immer nur auf Speicher zeigen, welcher existiert !

D.h. in der Regel legt man ein Array an und weist dessen Adresse einem 
Pointer zu.

Legt man ein Array innerhalb einer Funktion an, ist es natürlich nach 
Beenden der Funktion ungültig.

Soll eine Funktion etwas in einem Array speichern, muß der Aufrufer das 
Array anlegen und einen Pointer darauf übergeben !


Nicht böse gemeint, aber Dein Code ist gequirlte Scheiße, er verletzt 
fast alle C-Programmier-Regeln. Unter Windows würdes Du dafür nen satten 
Blue-Screen kassieren.
printf("%c",=Write_SPI(0xFF));

Ich hab ja schon viel gesehen, aber ein "=" als Präfix noch nicht.


Peter

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da dein Code, wie Peter schon treffend bemerkte, völlig sinn- und 
zweckfrei ist, bleibt eigentlich nur der Rat, ein Grundlagenbuch über C 
in die Hand zu nehmen, um den Umgang mit Pointern zu verstehen. Dann 
kannst du deine Frage selber beantworten.

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag :


Versuch mal zu verstehen, was

char * daten;
.
.
.
for(unsigned int c=0; c<528; c++)
  {
    *daten++=Write_SPI(0xFF);
  }

anrichtet. Wenn du das verstanden hast, dürfte dir auch klar werden, 
warum weder
char * ergebniss=read_from_buffer(1);
noch
char ergebniss[529]=read_from_buffer(1);

so funktionieren wird.



Oliver

Autor: Jens Hause (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Also der fehler
printf("%c",=Write_SPI(0xFF));


es sollte heisen printf("%c",Write_SPI(0xFF)); war ein tippfehler.


Ich habe jetzt mal versucht zu verstehen und habe folgendes anzubieten 
und bitte um Krtitiken.


in der main

void main(void)
{
char ergebniss[529];
read_from_buffer(1,&ergebniss[0]);
printf(&ergebnis[0]);
}
void read_from_buffer(unsigned int buffer,unsigned char *daten)
{
/*hier sthet noch Code für Commandos des Atmel Flash über SPI
.
.
.
.
.
*/
for(unsigned int c=0; c<528; c++)
  {
    *daten++=Write_SPI(0xFF);
  }
return;
}

Wenn ich es richtig verstanden habe übergebe ich an die funktion 
read_from_buffer die adresse des arrays ergebnmiss in die Variable daten 
oder ????

im printf(&ergbeniss[0]); lese ich die daten des arrays wieder aus 
oder???

Bitte um Prüfung


Danke

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht schon mal deutlich besser aus.

> Wenn ich es richtig verstanden habe übergebe ich an die funktion
> read_from_buffer die adresse des arrays ergebnmiss in die Variable daten
> oder ????

Ja. Genauer gesagt übergibst du die Adresse des ersten Elements.

> im printf(&ergbeniss[0]); lese ich die daten des arrays wieder aus
> oder???

Ja. Dazu muss aber sichergestellt sein, dass ergebniss ein 
Nullterminierter String ist. Man kann &ergebniss[0] auch verkürzen zu 
ergebniss.

Übrigens: Ergebnis schreibt man mit einem s.

Autor: Jens Hause (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na dann siehts ja gut aus und es funktioniert nun habe ich noch ein 
zweites problem.


ich will eine Structur erstellen in Array form


meine structur

struct
{
char datum[11];
char uhrzeit[9];
char temp[6];
}temperatur[1000];

char date[11];

zugriff auf die Variablen müsste ja so gehen

temperatur[x].datum
temperatur[x].uhrzeit
temperatur[x].temp

zuweisen würde ich mit memcpy(temperatur[x].datum,date,strlen(date));

wie kann ich deses Array darstellen


printf("%c",&temperatur[0].datum[0]); gehts nicht

wie kann ich einen zeiger auf die erste adresse des Arrays geben???
temperatur[0].datum????


danke








Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> printf("%c",&temperatur[0].datum[0]);
> gehts nicht

Wie wäre es mit
printf("%s", temperatur[0].datum); 

und mal genauem Ansehen der Formatspezifizierer von printf?



Autor: Jens Hause (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A ja ich dachte sowas gibts beim AVR GCC nicht %s wie ja auch der 
formatspezifizierer %f %g für float oder double typen.

Ja so gehts mit %s.

Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.