Forum: Compiler & IDEs Char und funktionen übergabe


von Jens Hause (Gast)


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

von Peter D. (peda)


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

von Jens Hause (Gast)


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.

von Peter D. (peda)


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.
1
printf("%c",=Write_SPI(0xFF));

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


Peter

von Oliver (Gast)


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

von Oliver (Gast)


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

von Jens Hause (Gast)


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

von Rolf Magnus (Gast)


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.

von Jens Hause (Gast)


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








von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

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

und mal genauem Ansehen der Formatspezifizierer von printf?



von Jens Hause (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.