(Rund um die...) Funktionszeiger



  • Hallo. Ich hab grad ein kleines GL programm geschrieben. Es soll eigentlich eine Extension nutzen, allerdings stürzt das Programm bei der ersten Benutzung einer Function der Extension folgendermaßen ab:

    Microsoft Visual C++ Debug Library:

    Run-Time Check Failure #0 - The value of ESP was not properlz saved across a function call. This is usuallz a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

    Die Funktionszeiger haben alle während der gesamten Laufzeit eine gültige Addresse, trotzdem läufts nicht. Gibts da irgendwas zu beachten?



  • Fehlermeldungen haben auch eine Aussage:

    calling a function declared with one calling convention with a function pointer declared with a different calling convention.

    Wie wär's denn dann mit etwas Code?



  • @davie: wieso code?
    @Webbi: das ist zwar nicht Standard-C++, aber wenn eine funktion zB mit __stdcall deklariert wurde, muss in der deklaration des funktionspointers auch __stdcall stehen. grund ist, dass __stdcall und freunde die art und weise angeben, mit der parameter an die funktion übergeben werden.



  • Original erstellt von Mr. N:
    [...] zB mit [...]

    genau sein B wollte ich wissen



  • Es geht hier schon um Standard-C++. Wie gesagt geht es hier um OpenGL Extensions. Also gibts eigentlich kein __stdcall oder sowas. Ein Beispiel zu geben ist schwierig. Was kann dieser Fehler denn alles bedeuten?



  • hmm... welche calling convention haste denn in den projekt eigenschaften?
    ps: und das alles frag ich _ohne_ msvc 😃



  • Es geht hier schon um Standard-C++. Wie gesagt geht es hier um OpenGL Extensions

    Steht das nicht irgendwie im Widerspruch? Standard-C++ kennt weder OpenGL noch
    Microsofts Visual C++ Debug Library. Und zum Thema calling conventions hat der C++ Standard auch nicht viel zu sagen (nur soviel, dass zwei Funktionen einen unterschiedlichen Typ haben, wenn sich ihre calling conventions unterscheiden).

    Ich schlage folgendes vor: Du schreibst ein *minimales* Beispiel wo Fehler auftritt, postest das hier und dann schaun wir mal, in wie weit wir dir hier helfen können.

    [ Dieser Beitrag wurde am 14.04.2003 um 11:20 Uhr von HumeSikkins editiert. ]



  • Also, ich bring mal kurz ein Beispiel. Warum ich ausdrücklich erwähne, das es sich um OpenGL Funktionszeiger handelt hat den Grund, damit ihr wisst, dass es keine Aufrufkonventionen oder sowas gibt und das ich die Adressen mit wglGetProcAddress() usw...

    Also, den Funktionszeiger definier ich folgendermaßen:

    void ( * glGenProgramsARB )( GLsizei n, GLuint *programs );
    

    Nachdem ich einen gültigen HWßRenderingkontext erstellt habe, ermittle ich die Adresse der Funktion im ICD:
    glGenProgramsARB = ( void ( * )( GLsizei, GLuint * ) )GetProcAddress( "glGenProgramsARB" );

    Die Funktion GetProcAddress ist folgendermaßen aufgebaut:
    PROC GetProcAddress( const char* ProcName ) const {
        PROC Proc = wglGetProcAddress( ProcName );
        if( !Proc ) {
            throw ProcName;
        } else {
            return( Proc );
        }
    }
    

    Alle Funktionszeiger haben eine ziemlich gültig aussehende Adresse, und zwar während der gesamten Laufzeit. Allerdings kommt bei der Benutzung der oben geschilderte Fehlerdialog.



  • Hallo,
    also ich würde mal sagen, du machst irgendwas mit OpenGL falsch. Ein Standard-C++ Problem sehe ich hier jedenfalls nicht.

    Nur mal so nebenbei:
    Was ist PROC?
    Was ist

    HWßRenderingkontext

    ?
    Was heißt "ICD"?

    Ich verschieb die Frage mal nach Rund um.


Anmelden zum Antworten