EEPROM, float und Array

Gast #3824340
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
Moderator Persönliche Seite #3824367
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.
#3824369
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren