Ingo schrieb:
> Die Warnung ist jedenfalls weg! Ich verstehe die ganze Sache aber nicht.
> start() ist ein Funktionspointer auf eine Adresse, richtig?
Richtig.
Und damit hattest du eine Initalisierung (Betrachtung der Datentypen)
Funktionspointer = ganze Zahl
Und das passt nun mal von den Datentypen her nicht.
Funktionspointer = Funktionspointer
würde besser passen. Also sollte man die 0 zu einem Funktionspointer
casten. Am besten führt man sich dafür einen typedef ein. Sonst werden
die Typschreibweisen schnell unübersichtlich.
1 | typedef void (*voidFktPtr)(void)
|
2 |
|
3 | voidFktPtr start = (voidFktPtr)0x0000;
|
> Warum dann
> die Adresse als (void*) casten?
Weil definitionsgemäss ein void-Pointer mit allen anderen Pointer-Typen
kompatibel ist.
Ihr müsst anfangen, Datentypen ernst zu nehmen. Das ist wie in der
Physik die Einheiten. Da kann hundert mal stehen
x = 3 * t
wenn x die Einheit m/s hat (also eine Geschwindigkeit ist) und t die
Einheit °C hat (also eine Temperatur ist), dann ist diese Berechnung
einfach nur Unsinn, auch wenn man das numerisch selbstverständlich so
rechnen kann. 3 mal beispielsweise 25 kann man ausrechnen, das macht 75
und diese 75 kann ich an x zuweisen. Rein technisch ist das überhaupt
kein Problem. Aber das Ergebnis sagt nichts aus und ist unsinnig. In der
Betrachtung der Einheiten links und rechts vom = sehe ich, dass ich
gerade im Begriff bin, Blödsinn auszurechnen. In der Programmierung
übernehmen die Datentypen mehr oder weniger (auch) diese Aufgabe und
werden vom Compiler überprüft.