www.mikrocontroller.net

Forum: Compiler & IDEs EEPROM array of struct


Autor: P. Fischer (skybandit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen, mir gelingt es leider nicht zuverlässig Daten aus dem 
EEPROM zu lesen. Da ich in C noch nicht so fit bin hab ich es erstmal so 
versucht:

typedef struct {
  uint8_t PresetName[3];
  uint8_t PresetMin;
  uint8_t PresetSec;
} Preset_str;

//Vordefinierte Werte
Preset_str eePresets[6] EEMEM =
{
  {"A01", 1, 10},
  {"A02", 4, 25},
  {"A03", 7, 20},
  {"B01", 2, 11},
  {"B02", 4, 12},
  {"B03", 2, 45}
};

[...]
Preset_str work; //temp

//Einlesen
eeprom_read_block(&work, &eePresets[0], sizeof(Preset_str));

//Ausgeben
lcd_puts(work.PresetName);

Beim Kompilieren kommt erstmal eine Warnung "warning: pointer targets in 
passing argument 1 of 'lcd_puts' differ in signedness", der Wert scheint 
aber trotzdem ok zu sein. Wenn ich aber den Index von eePreset 
verändere, dann wird komisches Zeug angezeit.

Da scheint grundlegend was faul zu sein. Hilfeeee...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der String "A01" benötigt 4 Byte.

Peter

Autor: P. Fischer (skybandit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ohh ja, mit 4 Bytes funktioniert es!
Danke Peter

Jetzt noch eine Frage zu der Compiler Warnung:
main.c:197: warning: pointer targets in passing argument 1 of 'lcd_puts' 
differ in signedness

Gemeint ist die Zeile, in der Zeile 197: lcd_puts(work.PresetName);

Wie bekomme ich denn den Inhalt work.PresetName korrekt an die LCD 
Funktion übergeben?

Autor: P. Fischer (skybandit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, nach ein wenig tüfteln habe ich festgestellt, dass es an der 
Definition des structs liegt.

Wenn ich PresetName[4] als "char" deklariere, ist die Warnung weg, 
verwende ich stattdessen "int8_t" ist sie immer noch da.

Dabei sollte "char" doch genau "int8_t" entsprechen oder etwa nicht?

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Der String "A01" benötigt 4 Byte.

Als Initializer für ein char[3]-Array benötigt er genau die vorgesehenen 
3 Bytes.  Die abschließende Null eines String Literal wird nur 
übernommen, wenn Platz dafür da ist (C99 6.7.8.14).

Allerdings lässt sich so ein Char-Array dann nicht als String ausgeben, 
wie es der TE versucht, da die abschließende 0 fehlt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P. Fischer schrieb:

> Dabei sollte "char" doch genau "int8_t" entsprechen oder etwa nicht?

Ob ein char signed ist oder nicht, ist a priori nicht festgelegt. Das 
entscheidet der Compile bzw. der Compilerbauer.

Daumenregeln:
Du verwendest einen

* char, wenn du Texte speichern willst
* unsigned char oder uint8_t, wenn du einen kleinen Integer ohne
  Vorzeichen haben willst (also was zum rechnen)
* signde char oder int8_t, wenn du einen kleinen Integer mit
  Vorzeichen haben willst


In deinem Fall .... willst du Texte speichern .... und damit ist char 
der Datentyp der Wahl

Autor: P. Fischer (skybandit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abschließende Null.., hab da grad so ein Déjà-vu mit einem Null 
terminierten String :)

Die Daumenregel ist gut, wieder was dazu gelernt.

Danke euch
Gruß Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.