EEPROM array of struct

OP #1853757
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...
OP #1853963
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?
OP #1853975
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?
#1853986
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.
#1854083
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

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