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...
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?
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?
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.