Anzeige:
Ergebnis 1 bis 14 von 14

Thema: Bsp. aus man dlopen kom. nic: invalid conversion from `void*' to `double (*)(double)'

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719

    Bsp. aus man dlopen kom. nic: invalid conversion from `void*' to `double (*)(double)'

    In der Man-Page zu dlopen gibt es ein kleines Beispielprogramm, das die Cosinusfunktion aus der Mathebibliothek läd und den Cosinus von 2.0 ausgeben soll. Nur dieses Programm lässt sich bei mir nicht kompilieren. Bestimmt muss ich irgendeinen Compilerschlater umlegen, das der Compiler beim zuweisen nicht so sehr auf den Datentyp guckt. Ich wäre aber auch an einer Korrektur des Quelltextes interessiert, die den Quelltext auf einem modernen Compiler übersetzten lässt.

    Code aus der Manpage
    Code:
    #include <stdio.h>
    #include <dlfcn.h>
    
    int main(int argc, char **argv) {
        void *handle;
        double (*cosine)(double);
        char *error;
    
        handle = dlopen ("libm.so", RTLD_LAZY);
        if (!handle) {
            fprintf (stderr, "%s\n", dlerror());
            exit(1);
        }
    
        cosine = dlsym(handle, "cos");
        if ((error = dlerror()) != NULL)  {
            fprintf (stderr, "%s\n", error);
            exit(1);
        }
    
        printf ("%f\n", (*cosine)(2.0));
        dlclose(handle);
        return 0;
    }
    und Mecker vom Compiler
    Code:
    [axel@tecton sharedlib]$ gcc -o cosine cosine.cpp -rdynamic
    cosine.cpp: In function `int main(int, char**)':
    cosine.cpp:16: invalid conversion from `void*' to `double (*)(double)'
    [axel@tecton sharedlib]$

  2. #2
    Registrierter Benutzer
    Registriert seit
    25.01.2003
    Beiträge
    222
    ist doch eine eindeutige fehlermeldung
    ändere einfach die zeile mit
    Code:
    cosine = dlsym(handle, "cos");
    nach
    Code:
    cosine = (double (*)(double)) dlsym(handle, "cos");
    dlsym liefert immer void *

    gruss
    Arthur
    ---------
    irc.mrunix.de #mrunix

  3. #3
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Nur fürs Protokol,der Cast,den mein Vorposter vorschlägt ist nicht korrekt.
    In Standard C gibt es keinen korrekten Weg von einen void* Pointer auf einen Functionpointer zu casten.

    Aber da die ganze Lib + die Manpage inkorrekten Code enthält is' es wohl egal.

    Wenn du dein File in *.c umänderst,dann fällt auch die Warnung weg (so haben das die Autoren wohl gemacht).

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.01.2003
    Beiträge
    222
    sorry, aber nirgendwo stand dass es sich um c code handeln sollte,
    und für c++ ist es schon richtig.
    (wer programmiert noch pure c )

    gruss
    Arthur
    ---------
    irc.mrunix.de #mrunix

  5. #5
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von arthur
    sorry, aber nirgendwo stand dass es sich um c code handeln sollte,
    Na,da steht gcc
    und für c++ ist es schon richtig.
    Nope,das ist in C++ genauso falsch
    Kompiliere es mal als C Code
    gcc -W -Wall -ansi -pedantic
    und dann mal C++
    g++ -W -Wall -pedantic -std=c++98
    (wer programmiert noch pure c )
    *handheb* ,naja auch.

  6. #6
    Registrierter Benutzer
    Registriert seit
    25.01.2003
    Beiträge
    222
    wie schon gesagt c war nicht mein anliegen
    und in c++ funktioniert es immer noch ?
    was sollte denn da kommen ?
    ---------
    irc.mrunix.de #mrunix

  7. #7
    Registrierter Benutzer
    Registriert seit
    25.01.2003
    Beiträge
    222
    und schau dir doch mal die man page von gcc
    da steht was von c und c++ compiler
    ---------
    irc.mrunix.de #mrunix

  8. #8
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von arthur
    und in c++ funktioniert es immer noch ?
    Ist das jetzt eine Frage,oder fehlt da ein Wort ?
    was sollte denn da kommen ?
    Also bei mir (ohne Cast) schmeißt er bei beiden die Warnung.
    Der Cast verdeckt also einfach nur einen möglichen Fehler.
    Und der Grund ist einfach der,daß Data Pointer und Function Pointer nicht dieselbe Größe haben müssen.

    Gut das ist mehr Theorie,weil die Systeme wo das so ist wohl auch nicht diese Lib anbieten.
    Der OP hat auch keine andere Wahl,wenn er diese Lib verwenden will,er muß sich auf das Feld 'undefined behavior' begeben.

    War ja auch nicht mein Anliegen,dem OP die Lib schlecht zu machen.Wollte nur anmerken,daß es im Grunde nicht korrekt ist.

    Btw. es wäre von den Lib Entwicklern möglich gewesen zwei Funktionen anzubieten,eine die einen void * liefert,und die andere einen generischen Functionpointer.

    und schau dir doch mal die man page von gcc
    da steht was von c und c++ compiler
    Was willst du damit sagen?

  9. #9
    Registrierter Benutzer
    Registriert seit
    25.01.2003
    Beiträge
    222
    Der Cast verdeckt also einfach nur einen möglichen Fehler
    Und der Grund ist einfach der,daß Data Pointer und Function Pointer nicht dieselbe Größe haben müssen
    bei mir läuft es natürlich auch nur mit dem cast, wobei ich immer noch nicht
    sehen kann wo dort der "Fehler" liegen kann ?
    also nochmals, dlsym liefert immer void *, es ist in deiner veranwortung dafür
    zu sorgen dass du die funktion richtig ansprichst.
    zeiger sind einfach adressen, diese können keine unterschiedlichen grössen haben
    (zumindenst nicht in einem program)
    und meine bemerkung mit man gcc bezog sich auf die aussage
    Na,da steht gcc
    der name der datei hatte aber eine .cpp endung
    also war es ein c++ aufruf
    ---------
    irc.mrunix.de #mrunix

  10. #10
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Original geschrieben von arthur
    ist doch eine eindeutige fehlermeldung
    ändere einfach die zeile mit
    Code:
    cosine = dlsym(handle, "cos");
    nach
    Code:
    cosine = (double (*)(double)) dlsym(handle, "cos");
    Aha, ich hatte immer dieses probiert:

    Code:
    cosine = double (*)(double)dlsym(handle, "cos");
    Das gibt einen schönen Syntaxerror

  11. #11
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von arthur
    bei mir läuft es natürlich auch nur mit dem cast, wobei ich immer noch nicht
    sehen kann wo dort der "Fehler" liegen kann ?
    also nochmals, dlsym liefert immer void *, es ist in deiner veranwortung dafür
    zu sorgen dass du die funktion richtig ansprichst.
    zeiger sind einfach adressen, diese können keine unterschiedlichen grössen haben
    (zumindenst nicht in einem program)
    Nope.
    Data Pointer und Function Pointer sind zwei völlig verschiedene Dinge,genau wie Pointer auf Klassenmemberfunktionen.
    Chris Torek über Pointer http://www.google.de/groups?q=functi...sdi.com&rnum=6.

    und meine bemerkung mit man gcc bezog sich auf die aussage
    der name der datei hatte aber eine .cpp endung
    also war es ein c++ aufruf
    Code:
    /* main.cpp */
    #include <iostream>
    int main() {}
    a) gcc main.cpp
    b) g++ main.cpp
    .

  12. #12
    Registrierter Benutzer
    Registriert seit
    25.01.2003
    Beiträge
    222
    natürlich sind es zwei verschiedene sachen,
    aber gespeichert werden sie in einem speicherbereich mit der gleichen
    grösse.
    und dein beispiel mit iostream ist zwar nett hat aber nichts mit
    dem compiler zu tun,
    der unterschied zwischen gcc und g++ liegt einfach daran
    dass g++ implizit die stdc++ bibliothek linkt und gcc nicht
    ---------
    irc.mrunix.de #mrunix

  13. #13
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von arthur
    natürlich sind es zwei verschiedene sachen,
    aber gespeichert werden sie in einem speicherbereich mit der gleichen
    grösse.
    [ ] Du hast dir den Link angeschaut.

    Naja,is' mir im Grunde auch völlig egal,ich bin raus dieser Diskussion.

    und dein beispiel mit iostream ist zwar nett hat aber nichts mit
    dem compiler zu tun,
    der unterschied zwischen gcc und g++ liegt einfach daran
    dass g++ implizit die stdc++ bibliothek linkt und gcc nicht
    Es sollte auch nur nett sein .

  14. #14
    Registrierter Benutzer
    Registriert seit
    25.01.2003
    Beiträge
    222
    hatte link angeschaut, konnte aber dort nichts finden was
    meine meinung umstimmen sollte.
    und ich sehs auch so, die diskussion ist beendet
    ---------
    irc.mrunix.de #mrunix

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •