Hallo, ich steuere über einen Atmega32 ein Display an. Der Atmega soll später verschiedene Routinen ausführen und dazu brauch ich ein Menü. Habe hier im Forum mehrere Ansätze zu struct-Aufbauten gesehen, habe auch verschiedenes probiert. Doch bis jetzt hab ich es nicht geschaft, in eine struct zu schreiben, noch sie auszulesen. Wenn ich also meinetwegen eine struct wie folgt habe: typedef struct def_menue { const unsigned char text; int8_t previous; int8_t next; int8_t now; } menue; wie kann ich jetzt z.B. den ersten Eintrag mit meinetwegen "Uhrzeit" erstellen? Und dann z.B. Uhrzeit.next einen Wert zuweisen? Das allein reicht ja anscheinend nicht: const menue Uhrzeit PROGMEM={"hallo",1,2,3}; Kann mir das vielleicht einer erklären? Wäre sehr nett! dnm
def_menue myMenue[10]; //Jetzt hast Du 10*dein def_menue myMenue[0].text = "Hallo Welt"; myMenue[0].next = 1; und so weiter.
so funktioniert es nicht. Wenn dort def_menu dortsteht, kommt der fehler "def_menue" undeclared, aber auch "menue" führt nicht zum erfolg. so hab ichs jetzt: #include <inttypes.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/delay.h> #ifndef F_CPU #define F_CPU 8000000UL /* Quarz mit 8Mhz */ #endif typedef struct def_menue { const unsigned char text; int8_t previous; int8_t next; int8_t now; } menue; int main(void) { menue myMenue[10]; //Jetzt hast Du 10*dein def_menue myMenue[0].text = "Hallo Welt"; myMenue[0].next = 1; } beim compilieren: -------- begin -------- avr-gcc (GCC) 3.4.6 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Linking: test.elf avr-gcc -mmcu=atmega32 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -f pack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns= -std=gnu99 -Wp ,-M,-MP,-MT,test.o,-MF,.dep/test.elf.d --output test.elf -Wl,-Map=test.map,-- cref -lm C:/Programme/WinAVR/bin/../lib/gcc/avr/3.4.6/../../../../avr/lib/avr5/cr tm32.o: In function `__vectors': ../../../../../avr-libc-1.4.4/crt1/gcrt1.S:51: undefined reference to `main' make: *** [test.elf] Error 1
Es muss "struct menue myMenue[10];" heißen, standard C brauch das struct noch. viel spaß ;)
also es muß wirklich ein Fehler sein, der mir im Moment nicht auffällt. Es lässt sich nicht compilieren?! stimmen die includes? das makefile? (im anhang) hab den avr-gcc 3.4.6 was könnt das sein? Programm leicht abgeändert/vereinfacht: #include <inttypes.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/delay.h> #ifndef F_CPU #define F_CPU 8000000UL /* Quarz mit 8Mhz */ #endif struct menue { const unsigned char text; int8_t previous; int8_t next; int8_t now; } ; int main(void) { struct menue myMenue[10]; //Jetzt hast Du 10*dein def_menue myMenue[0].text = "Hallo Welt"; myMenue[0].next = 1; }
ok. im makefile stimmte der SCR= nicht hier jetzt ein "anständiger" Fehler: Compiling: test.c avr-gcc -c -mmcu=atmega32 -I. -gstabs -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=test.lst -st d=gnu99 -Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.d test.c -o test.o test.c: In function `main': test.c:21: error: assignment of read-only member `text' test.c:21: warning: assignment makes integer from pointer without a cast make: *** [test.o] Error 1
Also, Du deklarierst text als "const" (und somit als "read-only") und änderst es dann doch. Erklärt den ersten Fehler. Außerdem deklarierst Du text als "char" (also als einzelnen Buchstaben) und nicht als "char *" (Zeiger auf Buchstaben / String). Erklärt die zweite Warnung. Sicher, dass Du nicht ein C-Buch lesen möchtest?
"Sicher, dass Du nicht ein C-Buch lesen möchtest?" Hallo Christian, du hast recht, in solchen Dingen hab ich noch Nachholbedarf, nur bin ich so lange vor dem PC gesessen, dass ich die einfache Lösung nich mehr gesehen hatte. Die PROGMEM option hat mich dann völlig aus dem Konzept geworfen. Jetzt klappt alles und ich dank euch nochmal! Hab ja auch wieder was dazu gelernt! Schönen Tag noch! dnm
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.