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.