PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD-Menü - Compilerwarnungen



PcVirus
10.04.2008, 15:23
Hi,
ich habe mir ein kleines Menü für mein LCD Programmiert. Funktionieren tut es auch. Allerdings bekomme ich noch einige Compilerwarnungen.

Hier der Code:


//Definitionen (in der Funktion showMenu() )
#define HAUPT 0
#define SUB 1
uint8_t cursor = 0; //Zeilenposiition
uint8_t menu_pos = HAUPT; //Enthält die aktuelle Position im Menü (Haupt oder SUB)
uint8_t akt_cat = 0; //Wird für das SUB Menü benötigt, um die gewählt haupkategorie zu erkennen
char * main_cat[4];
char * sub_cat[4][4];
uint8_t status = 0; //Wenn 1, dann wird die while schleife unterbrochen

main_cat[0] = "---Hauptmenu---";
main_cat[1] = "Beep";
main_cat[2] = "Nix";
main_cat[3] = "Nix2";
main_cat[4] = "";

sub_cat[1][0] = "Zurueck";
sub_cat[1][1] = "Lang-kurz-Lang";
sub_cat[1][2] = "kurz-kurz-kurz";
sub_cat[1][3] = "kein Anschluss";

//Aufruf (aus der Funktion showMenu() )
redraw(&cursor, &akt_cat, &menu_pos, &main_cat, &status);

//Funktion redraw()

//Zeigt das Hauptmenü erneut an
void redraw(uint8_t *_cursor, uint8_t *_akt_cat, uint8_t *_menu_pos, char* *_main_cat, uint8_t *_status){
#define HAUPT 0
#define SUB 1
lcd_clrscr();
*_cursor=0;
*_akt_cat=0;
*_menu_pos=HAUPT;
for(uint8_t i=0; i<4; i++){
lcd_gotoxy(0,i);
lcd_puts(_main_cat[i]);
}
*_status=0;
}

Warnungen:


main.c: In function 'showMenu':
main.c:287: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:293: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:299: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:305: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:308: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:317: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:324: warning: passing argument 4 of 'redraw' from incompatible pointer type


Wie kann ich die noch beheben?

MfG Jörn

McJenso
11.04.2008, 18:56
Hallo Jörn,

da gibt es einige Sache in dem Code.


char * main_cat[4];

Hiermit reservierst du 4 Byte für 4 Zeiger auf char.



main_cat[0] = "---Hauptmenu---";
main_cat[1] = "Beep";
main_cat[2] = "Nix";
main_cat[3] = "Nix2";
main_cat[4] = "";

Das passt nie und nimmer in vier Byte :shock:

Du suchst:


char main_cat[5][16] ={"---Hauptmenu---",
"Beep", ...

""};

Das gleich gilt natürlich auch für sub_cat.
Die 5 steht für 5 Elemente und nicht für den größten Index. Die 16 Bytes werden gebraucht, da ein String immer mit einer 0 abschließt.

Jetzt musst du noch Zeiger beim Funktionsaufruf übergeben.
foo (&main_cat[1][0]);
Zeigt auf den Anfang von Beep.
Wenn du jetzt noch in der Deklaration der Funktion einen einfachen Zeiger auf char angibst, sieht das bestimmt schon viel besser aus.


Gruß

Jens

PcVirus
11.04.2008, 20:12
Ich habe das mit den Variablen mal geändert. Ich bekomme aber immernoch die Warnungen. Die gehen auch weg wenn ich als aufruf z.B. "main_cat[1][0]"
wähle. Aber dann funktioniert ja meine redraw Funktion nicht mehr, da dort ja alle Einträge von main_cat durchgegangen werden.



//Definitionen
#define HAUPT 0
#define SUB 1
uint8_t cursor = 0; //Zeilenposiition
uint8_t menu_pos = HAUPT; //Enthält die aktuelle Position im Menü (Haupt oder SUB)
uint8_t akt_cat = 0; //Wird für das SUB Menü benötigt, um die gewählt haupkategorie zu erkennen
char main_cat[4][16]; //Maximal 15zeichen lang
char sub_cat[4][4][28]; //Max 27 Zeichen
uint8_t status = 0; //Wenn 1, dann wird die while schleife unterbrochen

strcpy(main_cat[0], "---Hauptmenu---");
strcpy(main_cat[1], "Beep");
strcpy(main_cat[2], "Nix");
strcpy(main_cat[3], "Nix2");
strcpy(main_cat[4],"");

strcpy(sub_cat[1][0], "Zurueck");
strcpy(sub_cat[1][1], "Lang-kurz-Lang");
strcpy(sub_cat[1][2], "kurz-kurz-kurz");
strcpy(sub_cat[1][3], "kein Anschluss");

//Aufruf
redraw(&cursor, &akt_cat, &menu_pos, &main_cat, &status);

//Redraw
void redraw(uint8_t *_cursor, uint8_t *_akt_cat, uint8_t *_menu_pos, char *_main_cat, uint8_t *_status){
#define HAUPT 0
#define SUB 1
lcd_clrscr();
*_cursor=0;
*_akt_cat=0;
*_menu_pos=HAUPT;
for(uint8_t i=0; i<4; i++){
lcd_gotoxy(0,i);
lcd_puts(_main_cat[i]);
}
*_status=0;
}

Fehler:


main.c: In function 'showMenu':
main.c:286: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:292: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:298: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:304: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:307: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c:316: warning: passing argument 4 of 'redraw' from incompatible pointer type
main.c: In function 'redraw':
main.c:346: warning: passing argument 1 of 'lcd_puts' makes pointer from integer without a cast


Mit dem Code wird das Menü nichteinmal erneut angezeigt(Funktion redraw). In der Funktion habe ich ja auch nicht den gesamten Inhalt von main_cat. Wie kann ich das Problem lösen ohne globale Variablen zu verwenden?

MfG Jörn

EDIT:
Wohl die einfachste Lösung


if(redraw==1){
lcd_clrscr();
cursor=0;
akt_cat=0;
menu_pos=HAUPT;
for(uint8_t i=0; i<4; i++){
lcd_gotoxy(0,i);
lcd_puts(main_cat[i]);
}
status=0;
redraw=0;
}
Wo sonst redraw(....) aufgerufen wurde, wird einfach redraw auf 1 gesetzt und beim nächsten Schleifendurchlauf wird die if-Abfrage durchlaufen.

Ob es mit einer Pointerlösung auch geht interessiert mich trotzdem noch.

McJenso
11.04.2008, 20:36
Hallo,



redraw(&cursor, &akt_cat, &menu_pos, (char*)main_cat, &status);


Gruß

Jens