Forum: Compiler & IDEs EEPROM, float und Array


von hal (Gast)


Lesenswert?

Hallo,
ich habe ein float Array im EEPROM:
1
#include <avr/eeprom.h>
2
3
float _test[] EEMEM = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9};

Jetzt möchte ich eine bestimme Stelle aus dem Array lesen. Hab aber 
keine Ahnung wie das korrekt gehen soll?
1
float f = eeprom_read_float((uint8_t *)&_test + 4*i);
???

und später auch wieder schreiben?

Kann mir jemand helfen?

Danke

von Peter II (Gast)


Lesenswert?

warum nicht einfach so
1
float f = eeprom_read_float(_test + i);

von Karl H. (kbuchegg)


Lesenswert?

1
float f = eeprom_read_float( & _test[i] );

von hal (Gast)


Lesenswert?

;-) OK,
aber warum funk­ti­o­nie­rt das?

von Peter II (Gast)


Lesenswert?

hal schrieb:
> aber warum funk­ti­o­nie­rt das?

warum denkst du das es nicht funktioniert?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

hal schrieb:
> aber warum funk­ti­o­nie­rt das?

Stichwort: Pointerarithmetik.

von Karl H. (kbuchegg)


Lesenswert?

hal schrieb:
> ;-) OK,
> aber warum funk­ti­o­nie­rt das?

?
Vielleicht mal ein C Buch konsultieren?
Pointer Arithmetik bzw. die Pointer-Array Dualität sind eigentlich in C 
recht wichtige Konzepte.

von hal (Gast)


Lesenswert?

1
float f = eeprom_read_float( & _test[i] );
kann ich verstehen, aber
1
float f = eeprom_read_float(_test + i);

ich merke mal wieder, dass ich C immer noch nicht verstanden hab :)

von Mike (Gast)


Lesenswert?

hal schrieb:
> aber warum funk­ti­o­nie­rt das?

Weil du Funktion eeprom_read_float() mit der Adresse des richtigen 
Elements aufgerufen wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

hal schrieb:
>
1
float f = eeprom_read_float( & _test[i] );
> kann ich verstehen, aber
>
1
float f = eeprom_read_float(_test + i);
>
> ich merke mal wieder, dass ich C immer noch nicht verstanden hab :)

Steht doch oben: Pointerarithmetik.

   &_test[i] ist vom Ergebnis dasselbe wie _test + i

Ich wiederhole jetzt hier nicht die unzähligen Posts von Karl Heinz, in 
denen er das erklärt. Nimm einfach Dein C-Buch und schlag nach.

von Karl H. (kbuchegg)


Lesenswert?

hal schrieb:
>
1
float f = eeprom_read_float( & _test[i] );
> kann ich verstehen, aber
>
1
float f = eeprom_read_float(_test + i);

Weil in C die Array-Index Operation in Form von Pointer Arithmetik 
definiert ist.
1
     a[i]  <==>  *( a + i )

wenn du zu einem Pointer a etwas dazuzählt, dann multipliziert der 
Compiler automatisch das i mit der Größe des Basistyps, in deinem Fall 
eben der sizeof(float), wenn es dann darum geht auf Assemblerebene den 
Zugriff zu machen.

Tatsächlich ist das erste, ws der Compiler macht, wenn du a[i] 
schreibst, das er das in die Form *(a+i) umwandelt und erst dann damit 
weiter arbeitet.


Dau kannst in C ja auch schreiben
1
    double* p = malloc( 5 * sizeof(double) );
2
3
    p[0] = 2.0;
4
    p[1] = 3.0;
Genau hier kommt die Pointer Array Dualität zum tragen. Und genau das 
ist auch der Grund, warum der Name eines Arrays alleine als die 
Startadresse (vulgo Pointer) des Arrays fungiert.
In C kann man Arrays nicht ohne Pointer verstehen und Pointer nicht ohne 
Arrays. Beides sind gewissermassen 2 Spielarten von ein und demselben. 
Und beides kann man nicht verstehen ohne Pointerarithmetik.

von hal (Gast)


Lesenswert?

Danke an ALLE!
Jetzt hab ich ja passende Stichwörter um mich weiter zu Informieren.

von Torsten (Gast)


Lesenswert?

Karl Heinz schrieb:
> Weil in C die Array-Index Operation in Form von Pointer Arithmetik
> definiert ist.
>      a[i]  <==>  *( a + i )

Und das Lustige ist: da die Addition kommutativ ist, ist a[i] das 
gleiche wie i[a] :-)

von Walter Tarpan (Gast)


Lesenswert?

Torsten schrieb:
> da die Addition kommutativ ist,

Wer hat Dich denn auf die Idee gebracht?
1
uint8_t a, b;
2
3
a = b = 200;
4
a = a+60+(-20);
5
b = b+(-20)+60;
6
7
return a==b ? true : false;

von Walter Tarpan (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Torsten schrieb:
>> da die Addition kommutativ ist,
>
> Wer hat Dich denn auf die Idee gebracht?uint8_t a, b;
>
> a = b = 200;
> a = a+60+(-20);
> b = b+(-20)+60;
>
> return a==b ? true : false;

Mist. Falsch gedacht. Ich habe Unsinn geschrieben. Bitte nicht lesem :-)

von Peter II (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Wer hat Dich denn auf die Idee gebracht?uint8_t a, b;
>
> a = b = 200;
> a = a+60+(-20);
> b = b+(-20)+60;
>
> return a==b ? true : false;

true - was andere hätte ich auch nicht erwartet. Oder was wolltest du 
uns damit sagen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Walter Tarpan schrieb:
> Mist. Falsch gedacht. Ich habe Unsinn geschrieben. Bitte nicht lesem :-)

Ich habe mir die Augen zugehalten. Richtig so? ;-)

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.