PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C Pointer auf Funktionen


Gast
2007-05-23, 10:39:45
Hallo,

ich hab mal ein bischen mit Zeigern auf Funktionen rumgespielt:

#include <stdio.h>

typedef int (*funcYou)();

int ftest1( ) { return 0; };
int ftest2( ) { return 0; };

int main ( void ) {

funcYou testFunc;
testFunc=ftest1;
if (testFunc==NULL) {printf("NULL" );}
else {printf("nicht NULL" );}

return 0;
}

Beim Test auf NULL wird "NULL" ausgegeben, obwohl doch eigentlich "nicht NULL" zurückgegeben werden müßte, oder?
Setze ich statt ftest1 ftest2 ein wird "nicht NULL" ausgegeben (so wie es eigentlich sein sollte).
Ich habe auch schon beim Vergleich NULL durch 0 ersetzt.
Was mache ich falsch?

Coda
2007-05-23, 10:49:57
Bei mir kommt da wunderbar "nicht NULL" raus. Probier mal "testFunc=&ftest1;". Manche Compiler sind da komisch.

Anderer Gast
2007-05-23, 11:01:49
Also bei funktioniert das mit und ohne Adressoperator (GCC). Welchen Compiler benutzt du?

Besserwissend
2007-05-23, 11:11:35
Bei mir kommt da wunderbar "nicht NULL" raus. Probier mal "testFunc=&ftest1;". Manche Compiler sind da komisch.

Da kommt immer noch "NULL" raus. :confused: ob &ftest1, &(ftest1), ftest1.
Compiler ist übrigens OpenWatcom wcc 1.6.
Wenn ich einen "dummy" einfüge klappts für ftest1 und ftest2 mit "nicht NULL". Für den Dummy selbst wieder "NULL". :confused:

Gast
2007-05-23, 11:59:48
Was kommt raus, wenn du 1 statt 0 zurückgibst?

Vielleicht kann der Watcom ja 0 und Null nicht unterscheiden.

Besserwissend
2007-05-23, 15:55:56
Für alle die es interessiert: Es ist ein Linker-Problem.
Der zu WatCom mitgelieferte Linker wlink versucht, falls die SYS-Direktive (Angabe des Zielsystems, wie DOS, OS2, Windows etc.) "leer" ist, den "executable type" aufgrund der Objektdateien zu "raten".
Auch wenn absolut keine Fehlermeldungen, Warnungen etc. durch den Linker ausgegeben werden und der geratene Typ stimmt, führt dies zu komischen (ausführbaren!!!) "Resultaten" (mit Segementverschiebungen etc.), wie Eingangs beschrieben.
Syntaktisch ist der Quelltext OK. Trotzdem kommt es immer wieder vor, daß ein Compiler einige der Möglichkeiten in C Zeiger zu (de)referenzieren nicht mag, obwohl der erste ANSI Standard auf die 20 zugeht.

Coda
2007-05-23, 16:07:22
Was kommt raus, wenn du 1 statt 0 zurückgibst?
Die Funktion wird ja gar nicht aufgerufen.

Sephiroth
2007-05-23, 16:50:20
Die Funktion wird ja gar nicht aufgerufen.
Der Gast meint sicher bei den Funktionen 1 statt 0 zurückgeben.
Sein Gedankengang ist wohl der:
Compiler sagt sich bei 0 (funktion gibt ja stets 0 zurück) mach ich gleich 0 aus der Funktion und dann sei NULL == 0 wahr.

rotalever
2007-05-23, 17:52:25
Der Gast meint sicher bei den Funktionen 1 statt 0 zurückgeben.
Sein Gedankengang ist wohl der:
Compiler sagt sich bei 0 (funktion gibt ja stets 0 zurück) mach ich gleich 0 aus der Funktion und dann sei NULL == 0 wahr.
Dann wäre aber der Wert gleich 0 und nicht der Pointer.

Ectoplasma
2007-05-23, 18:36:17
Der Gast meint sicher bei den Funktionen 1 statt 0 zurückgeben.
Sein Gedankengang ist wohl der:
Compiler sagt sich bei 0 (funktion gibt ja stets 0 zurück) mach ich gleich 0 aus der Funktion und dann sei NULL == 0 wahr.

Dem Compiler ist es egal, was zurückgegeben wird, da die Funktion gar nicht aufgerufen wird. Hier geht es um einen Test auf einen Funktionspointer.