Frage zu Funktionspointer



  • Hallo Ihr,

    ich habe folgenden Funktionspointer

    void (*anyPtr) (void*);
    

    diesem Pointer kann ich nun folgende

    int FuncA(int a,int b){...}
    int FuncB(int a){...}
    

    also funktionen unterschiedlicher signaturen zuweisen!? aber wieso gehts das?

    anyPtr= FuncA;
    anyPtr(1,2); //GEHT
    anyPtr(1);  //GEHT
    
    anyPtr= FuncB
    anyPtr(1,2); //GEHT
    anyPtr(1);  //GEHT
    

    Jedes versuchte Variante funktioniert.. nun wollte ich wissen wieso das geht und ob es memoryleaks etc. geben kann wenn man sie falsch anwendet!?

    GRüße



  • --



  • Was heißt hier "geht"?
    warning: assignment from incompatible pointer type
    Das sagt doch wohl genug, oder weißt du nicht, was der Compiler dir damit sagen will?
    D.h. es "geht" oder "geht" nicht.



  • Aha verstehe, d.h. zur laufzeit könnten problem autreten? Es lässt sich ja übersetzen, und die Funktionpointer lassen sich auch aufrufen .. hmm



  • Dass sich was übersetzen lässt, mit oder ohne Warnungen, sagt erstmal nicht aus, dass etwas "funktioniert".
    Der Standard schreibt nicht vor, was ein Compiler bei inkonformen Konstrukten machen soll, Fehler/Warnung/Hinweis/gar nichts.
    Das ist Sache des Compilerherstellers, ob er o.g. Konstrukt übersetzt und nur eine Warnung ausgibt oder nicht übersetzt und einen Fehler wirft.
    Manche Compiler bieten sogar an: "Warnungen als Fehler behandeln", und dann "gehts" bei dir eben nicht mehr.
    Auch ist es natürlich Sache des Compilerherstellers, was für einen konkreten Code er hierbei erzeugt, und ebenso, ob dasselbe Compilat in der gleichen Umgebung bei jedem Programmstart und/oder Schleifendurchlauf auch gleich arbeitet oder auch nicht.


  • Mod

    CDiscoverer schrieb:

    Aha verstehe, d.h. zur laufzeit könnten problem autreten? Es lässt sich ja übersetzen, und die Funktionpointer lassen sich auch aufrufen .. hmm

    Übersetzen lassen != wird funktionieren

    C vertraut sehr stark dem Programmierer. Wenn es nur irgendwie technisch möglich ist, wird auch gemacht, was der Programmierer sagt und vielleicht eine Warnung geschmissen, wenn es was ungewöhnliches ist.

    Hier ist es technisch möglich, die Zuweisung zu machen, da beide Pointertypen gleich groß sind. Es wird dann angenommen, dass du über die Hintergründe genau Bescheid weißt und irgendeinen tollen Trick planst.

    Was aber technisch eigentlich nicht möglich sein sollte, ist anyPtr(1,2); , da anyPtr von einem Typ ist, der nur ein Argument (den void*) hat. Aber vielleicht hat dein System irgendwelche tollen Calling-Conventions, bei denen das trotzdem irgendwie möglich ist und die dein Compiler als spezielle Erweiterung doch schluckt.

    Das alles ist natürlich unportabel wie Hölle (bei mir funktioniert es wie gesagt nicht), selbst wenn du dich nur auf die Variante mit der passenden Argumentenzahl beschränkst. Denn hier machst du einen Pointer aus einem Integer, pusht dann diesen Pointer auf den Funktionsstack, die Funktion erwartet dort einen Integer und wenn du jetzt noch annimmst, dass ein Pointer ja gewöhnlich größer ist als ein Integer, dann kann man sich allerlei coole Fehler vorstellen 🕶 .

    Wutz schrieb:

    Der Standard schreibt nicht vor, was ein Compiler bei inkonformen Konstrukten machen soll, Fehler/Warnung/Hinweis/gar nichts.
    Das ist Sache des Compilerherstellers, ob er o.g. Konstrukt übersetzt und nur eine Warnung ausgibt oder nicht übersetzt und einen Fehler wirft.

    Aber die Zuweisung von inkompatiblen Funktionspointern sollte durch den Standard erst einmal gedeckt sein, wenn ich mich richtig erinnere. Habe den Standard gerade nicht vorliegen. Erst wenn man den Zeiger dann benutzt, wird's lustig.



  • Danke ihr beiden:) Ich verwende VS2008 und spiele bischen mit c rum, umd zu sehen was so bischen möglich ist:)

    Da hab ich noch ne frage: In C ist ja Funktionsüberladung nich möglich, laut google kann das mit funktionspointern (emuliert) werden, wenn ja wie??

    Grüße



  • CDiscoverer schrieb:

    Da hab ich noch ne frage: In C ist ja Funktionsüberladung nich möglich, laut google kann das mit funktionspointern (emuliert) werden, wenn ja wie??

    Nein.

    Vielleicht meinst du Polymorphie durch virtuelle Funktionen, die können mit Funktionspointern emuliert werden. Wenn man beides verstanden hat ist auch unmittelbar klar, wie.


  • Mod

    Man könnte auch einfach C++ benutzen oder spricht was dagegen?


Anmelden zum Antworten