Hallo, ich würde gerne ein Array mithilfe von Pointern aus der "test.c" in die "main.c übergeben. ---- test.c -- uint8_t test(uint8_t id[],uint8_t *RET[]) { sp[0]=1; sp[1]=2; sp[2]=3; sp[3]=4; sp[4]=5; for (int i=0;i<5;i++){ *RET++ = sp[i];} } ---- ---- main.c -- int main(void { #include "test.h" ...... uint8_t ret[5]; test(&gSensorIDs[0][0][0],&ret); for (int i=0;i<5;i++){uart_puti(ret[i*2]);uart_puts_P("..");} } ---- Mein Problem ist: Er schreibt in jedes zweite Feld ret[1],ret[3]... eine "0" und ich verstehe nicht wieso. Mit ret[i*2] ist es zwar kein Problem, aber trotzdem würd ich gern wissen woran es liegt!!! Lg michi
Daran, dass du das Kapitel über pointer & arrays im K&R nicht verstanden hast.
1 | uint8_t test(uint8_t id[],uint8_t *RET) |
2 | {
|
3 | sp[0]=1; |
4 | sp[1]=2; |
5 | sp[2]=3; |
6 | sp[3]=4; |
7 | sp[4]=5; |
8 | for (int i=0;i<5;i++){ *RET++ = sp[i];} |
9 | }
|
10 | ...
|
11 | int main(void |
12 | {
|
13 | #include "test.h" |
14 | |
15 | ......
|
16 | uint8_t ret[5]; |
17 | test(&gSensorIDs[0][0][0],ret); |
18 | for (int i=0;i<5;i++){uart_puti(ret[i]);uart_puts_P("..");} |
19 | }
|
Ich denke, dass "id" auch noch flasch ist, aber da fehlen die Randinfos. #include innerhalb einer Funktion ist normalerweise eher schlechter Stil.
for (int i=0;i<5;i++){uart_puti(ret[i*2]);uart_puts_P("..");} } ---- > Mein Problem ist: Er schreibt in jedes zweite Feld > ret[1],ret[3]...eine "0" und ich verstehe nicht wieso. Eigentlich schreibst du in jedes zweite Feld gar nichts rein, d.h. es steht nachher noch immer das drin, was zufällig vorher an dieser Adresse stand. Nach dem Reset dürften das Nullen sein. > Mit ret[i*2] ist es zwar kein Problem, Doch, denn du hast ein Array aus 5 Elementen, also eines, auf das nur mit Index 0 bis 4 zugegriffen werden darf. Dein Index geht aber bis 8. Also schreibst du über das Ende des Arrays hinaus. > aber trotzdem würd ich gern wissen woran es liegt!!! Eben gerade an dem i*2. Wieso multiplizierst du überhaupt mit 2?
uint8_t test(uint8_t id[],uint8_t *RET[]) { ... *RET++ ... } Rhetorische Frage: was macht der ++ Um wieviel erhoeht er? Nun da RET zuallererst mal ein Pointer auf Pointer ist, erhoeht er um sizeof( uint8_t *). Das moeschtest Du aber nicht, du moechtest um sizeof( uint8_t ) erhoehen, da du ja an das naechste Array Element ran kommen willst. Da aber auf deinem System anscheinend sizeof( uint8_t*) == 2 * sizeof( uint8_t ) ist, beschreibst du nur jedes 2-te Array Element (und hast einen klassischen Fall von: 'hinter ein Array schreiben' und damit undefiniertes Verhalten) Die Frage ist doch: Warum ueberhaupt dieser Mambo-Zambo mit Pointer auf Array? Du duerfte ein bekannter Denkfehler vorliegen: Arrays werden naemlich sowieso immer per Pointer uebergeben. Auch dann, wenn Du schreibst void foo( int A[] ) Das ist naemlich nichts anders als eine andere (unsaegliche) Schreibweise fuer void foo( int * A ) oder in anderen Worten: Wenn einer Funktion ein Array uebergeben wird, dann kann diese Funktion immer die originalen Werte beim Aufrufer aendern. Das ist nun mal so, Arrays verhalten sich hier anders als normale Variablen. Andersrum ist es in C gar nicht moeglich: Es ist nicht moeglich ein Array an eine Funktion zu uebergeben, sodass diese Funktion eben nicht im originalen Array rumpfuschen kann.
Hi wenn man das aber will könnte man das Array in eine Struktur packen und schon..... Lassen wir das sonst verwirren wir riegaz noch vollständig :-) Matthias
Du bist nicht alleine :)...ich bin auch immmer verwirrt, wenn es um C geht. Gretz Marian
Der kleine Unterschied zwischen <datentyp> array[<elements>]; und <datentype> pointer; 'array' ist der NAME einer Ansammlung von <datentyp> Elementen. &array[5] kann zur Compilierzeit ausgewertet indem auf die Adresse des ersten Elements 5 * sizeof(<datentype>) addiert wird. 'pointer' ist der Name einer VARIABLEN welche auf die Adresse einer Ansammlung von <datentyp> Elementen zeigt. &pointer[5] muss während des Programmablaufes ausgerechnet werden indem der Inhalt der Variblen 'pointer' geladen wird und auf diesen Wert (der zur Compilierzeit berechnete) Offset von 5 * sizeof(<datentype>) addiert wird. Der Wert von 'array' kann niemals verändert werden. pointer = array; ist zulässig, array = pointer; aber nicht. Im einem Programm steht also die Zeichenfolge 'array' für die Adresse des Elements mit dem Offset 0 ( == &array[0] ), der Compiler 'ersetzt' den Text 'array' durch eine Adresse. Dagegen greift 'pointer' auf den eine Variable zu, der Compiler Was immer wieder verwirrt ist, dass man im Quelltext die gleichen Operatoren verwenden kann.
Letztlich will Dein Programm also wie folgt aussehen: uint8_t test(uint8_t id[],uint8_t *RET) { sp[0]=1; sp[1]=2; sp[2]=3; sp[3]=4; sp[4]=5; for (int i=0;i<5;i++) { *RET++ = sp[i]; } } ---- ---- main.c -- #include "test.h" int main(void) { ...... uint8_t ret[5]; test(&gSensorIDs[0][0][0],ret); for (int i=0; i<5; i++) { uart_puti(ret[i]); uart_puts_P("..");} } } Es wurde eigentlich nur das [] im Kopf von Test entfernt, sowie beim Aufruf der Adressoperator. Wobei die Geschichte mit gSensorIDs weiterhin unheimlich aussieht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.