Die Einträge in "menudata" werden wie folgt erzeugt:
1
const__flashcharMT_NULL[]={'\0'};
2
const__flashcharMT_RETURN[]="return";
3
const__flashcharMT_RESETZ[]="Achse Z=0";
4
const__flashcharMT_VAR01[]="t\eson,min \en =%4i";
5
6
menudata_tmenudat[]={
7
{MT_RETURN,fkt,NULL,NULL,0,0},
8
{MT_RESETZ,fkt,edm_resetZ,NULL,0,0},
9
{MT_VAR01,var,NULL,&tmp,4,64},
10
{MT_NULL,none,edm_menuhead,NULL,0,0},// Nullzeile markiert Ende des structs
11
};
Nun gemahnt mich der Compiler (vermutlich völlig gerechtfertigt):
"Warnung 1 passing argument 1 of 'strlen_PF' makes integer from pointer
without a cast".
Nur was erwartet er? Ich stehe gerade auf dem Schlauch.
Viele Grüße
Nicolas
Die _PF-Funktionen sind etwas schwierig in der Handhabung, weil ein
Zeiger beim AVR-GCC nur 16 bit groß ist, sie aber ein 32-bit-Argument
brauchen.
Bist du dir denn sicher, dass du überhaupt die F-Variante brauchst,
und dass es nicht strlen_P() tun würde (limitiert auf die erste 64 KiB)?
> Nun gemahnt mich der Compiler (vermutlich völlig gerechtfertigt):> "Warnung 1 passing argument 1 of 'strlen_PF' makes integer from> pointer without a cast".> Nur was erwartet er?
Was er erwartet ist klar. Das steht in der Fehlermeldung.
makes integer from pointer
D.h. der COmpiler fühlt sich genötigt, den Pointer den du hast
1
strlen_PF(menudata[nMenuEntries].menutext)
2
*******************************
in einen Integer (also int) umzuwandeln.
Die Frage ist nur: warum?
Schau dir mal den Protoypen zu strlen_PF an.
Mein gcc ist zu alt, ich hab die _flash Datentypen noch nicht hier
drauf.
Irgendwo muss es ja einen Protoypen von dieser Funktion geben. Da
schaust du mal nach, welcher Datentyp dort in der Argumentliste von
strlen_PF steht.
Es könnte auch sein, dass du eben keinen Protoypen für die Funktion hast
(Include File vergessen).
Denn in diesem Fall treten in C Default-Annahmen in Kraft. Und die
besagen in den meisten Fällen: ist nichts anderes bekannt, dann ist das
ein int.
D.h. wenn es keinen Protoypen gibt, dann muss der Compiler davon
ausgehen, dass strlen_PF eine Funktion ist, die einen int als Argument
nimmt und einen int als Returnwert liefert.
Also: der Protoyp für die Funktikon muss her, bzw. überprüfen ob das
korrekte Include File inkludiert wurde.
Jörg Wunsch schrieb:> Bist du dir denn sicher, dass du überhaupt die F-Variante brauchst,> und dass es nicht strlen_P() tun würde (limitiert auf die erste 64 KiB)?
Hallo Jörg,
danke für den Tipp! Du hast Recht, die "_PF"-Funktionen sind reiner
Overkill. Momentan läuft alles auf einem ATmega32 und mehr als einen
ATmega644 wird diese Firmware garantiert nie sehen, sonst müßte ich noch
ganz andere Sachen ändern.
Viele Grüße
Nicolas