Anfängerfrage zu Adressen und Zeiger
-
tictac ist eine Variable die per Zeit-Interrupt aufwärts gezählt wird:
extern volatile int32_t tictac;Nun reserviere ich eine Timer Variable mit
volatile int32_t blktimer;und eine Funktion setflop, welche die Timer Variable mit einem dazu übergebenen konstanten Zeitwert zur Systemuhr tictac eintragen soll
void setflop(int32_t timer, int32_t len)
{
timer = tictac + len;
}Wenn ich die Funktion nun aufrufe, muß ich beim ersten Argument wohl ein & Zeichen schreiben, damit die Adresse des Timers übergeben wird wo setflop reinschreiben soll. Die Zeitlänge 1000 wird so übergeben.
setflop (&blktimer,1000)
Nach diesem Aufruf sollte in blktimer der Wert von tictac+1000 stehen.
Tut er aber nicht, weil ein cast mit Stern zu fehlen scheint ? Oder sonst noch was ?
-
Machst du so, guckst du unten:
void setflop ( int32_t* timer, int32_t len ) { *timer = tictac + len; }
-
Nach welcher Regel soll der Stern einmal hinter den Typ und einmal vor den Variablennamen? GCC mach so eine unverständliche .\main.c:393: warning:
passing argument 1 of 'setflop' discards qualifiers from pointer target type
-
Nachtrag: Der Code funktioniert so tatsächlich wie gewünscht bzw. erwartet. Neben der bislang nicht verstandenen Meldung bzw. einem vermutlich irgendwo fehlenden Cast zeigt der Debugger den blktimer aber als unsigned und nicht korrekt als signed (wie ticatac) an.
-
Hab den gcc nicht, kann ich dir nix zu sagen. Mein Compiler meckert auch auf der höchsten Warnstufe nicht. Sicher das du ne *.c und nicht ne *.cpp Datei hast?
-
Besten Dank für deinen Hinweis. Selbstverständlich habe ich reines ANSI C und die Datei heisst main.c und um das plusplus mache ich bewusst (noch) einen riesen Bogen weil man ja auch alles ohne plusplus machen können soll.
Die Warnung liegt hier am volatile von blktimer welches den GCC (und mich mit der Warnung) durcheinanderbringt. Im Gegensatz zu ticatac wird die Variable ja nicht im Interrupt geschrieben und braucht deshalb nicht unbedingt volatile sein.
Macht man sie trotzdem volatile, so bringt GCC eine Warnung, daß er den Typ verwift. Warum? Dummerweise verwirft er dabei nicht nur volatile, sondern macht aus dem signed Integer auch gleich einen Unsigned integer was auch default für Character ist. Da ist es natürlich auch ziemlich sträflich, die Warnung einfach zu ignorieren.
Der Übersichtlichkeit habe ich mal alles mit 16 bit signed integer gemacht und bin damit dahintergekommen. Ab 32768 plus Zeitlänge hat das dann keine negativen Zahlen gegeben und je nach Systemzeit tut der Timer dann Mal und ein anderes Mal nicht.
-
Noch etwas merkwürdiges hier in der dazugehörenden Auswertefunktion:
int TestFlop(int16_t* timer) { if ((int16_t)(tictac - *timer) > 0) return (FALSE); else return (TRUE); }
Sowohl ticatac als auch die per Adresse übergebene Variable von timer ist ein signed Integer. Also sollte man annehmen, daß tictac-*timer ebenfalls ein signed Resultat liefert. Tatsächlich funktioniert die Abfrage im negativen Zahlenbereich aber nur dann, wenn ich den int16_t Typcase in der if-Zeil mache und ohne diesen Typecast funktioniert es nicht.
Summa Summarum scheint in einer Funktion der Variablentyp verlorenzugehen obwohl er ja in der Parameterliste eindeutig (?) als signed angegeben ist. Das Schlüsselwort signed gibts doch nur bei K&R und nicht mehr bei ANSI? wo alles signed ist wo nicht unsigned ist?