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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.