Forum: Compiler & IDEs EEPROM array of struct


von P. F. (skybandit)


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...

von Peter D. (peda)


Lesenswert?

Der String "A01" benötigt 4 Byte.

Peter

von P. F. (skybandit)


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?

von P. F. (skybandit)


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?

von Hc Z. (mizch)


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.

von Karl H. (kbuchegg)


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

von P. F. (skybandit)


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

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.