- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: LCD-Menü - Compilerwarnungen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174

    LCD-Menü - Compilerwarnungen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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:
    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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Hallo Jörn,

    da gibt es einige Sache in dem Code.
    Code:
    char * main_cat[4];
    Hiermit reservierst du 4 Byte für 4 Zeiger auf char.

    Code:
    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

    Du suchst:
    Code:
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.02.2005
    Ort
    Hannover
    Beiträge
    174
    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.

    Code:
    //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:
    Code:
    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
    Code:
    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.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    55
    Beiträge
    524
    Hallo,

    Code:
    redraw(&cursor, &akt_cat, &menu_pos, (char*)main_cat, &status);
    Gruß

    Jens

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test