Fehler wenn ich round benutze



  • Hi,
    wenn ich round benutzen will bricht das Kompileren mit dem Fehler

    Verknüpfen...
    gen_empty.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_round".

    ab. math.h ist eingebunden, Ich muss die Library wohl linken, ich hab keine Ahnung wie das geht, sorry

    MfG
    Luke


  • Administrator

    1. Ich kenne kein _round in der MFC.
    2. Ich kenne kein _round in C++.
    3. Ich kenne kein _round in C.

    Also anderst gefragt, woher hast du dieses _round? Oder habe ich diese Funktion echt immer übersehen? Die MSDN liefert jedenfalls nix.

    Grüssli



  • Ne im sourcecode steht

    recentPspVolume = round((recentVolume/255)*53);
    

    nicht _round.

    Ich benutze das round übrigens für eine DLL (Winamp-Plugin), diese Seite sagt es gäbe noch andere Ursachen für diese Fehlermeldung, ich kann aber nicht sagen welche. Die erste die ich dachte sie wär's wäre dass ich in den Projekteinstellungen noch für den Linker was einstellen muss (so wie hier), wenn es das ist, was muss ich tun?


  • Administrator

    Also dieser Fehler kommt im allgemein davon, dass man z.b. einen Header hat, wo eine Funktion deklariert ist (zum Beispiel):

    int round(float f);
    

    Dem Programm fehlt nun aber der dazugehörige .cpp Teil, bzw. der Bodyteil der Funktion. Das ist ja nur eine Headerdefinition.

    Mein Problem ist, wie gesagt, dass ich nicht weiss woher du dieses round hast. Im Standard C, C++ und der MFC gibt es, soweit ich weiss, kein round. Also hast du das wohl aus einem Header, welcher bei einer DLL mitgeliefert wurde. Damit es nun funktioniert, musst du die Lib der DLL, und die DLL selbst in dein Projekt einbinden. Also in dein Projektordner kopieren. Ich glaube die Lib muss im Projektordner sein und die DLL im Debug/Release Ordner, sofern du mit VS arbeitest.

    Dann musst du noch unter den Eigenschaften deines Projekts, bzw. deiner Solution, unter Linker->Input->Additional Dependencies den Namen der Lib dazufügen. Du kannst übrigens die Lib auch im Standardordner belassen und einfach dann noch unter Linker->General->Additional Library Directories den Pfad angeben, wo der Compiler, bzw. Linker, nach weiteren Libs suchen soll, welche für dein Projekt benötigt werden.

    War das soweit verständlich? 😉

    Grüssli



  • Verständlich ja, nur weiß ich jetzt nicht genau welche Pfade/Bilbiotheken ich benutzen muss. Im moment includiere ich math.h mit #include. Welche Library muss ich jetzt einbinden und wo finde ich die?

    MfG
    Luke


  • Administrator

    In math.h gibt es allerdings kein round. Das round kommt von irgendwo anders. Wie gesagt, dass musst du wissen. Hast du womöglich in einem Header ein round definiert und kein Body dazugesetzt?

    Grüssli



  • Ich hab nirgends round definiert, ich dachte das wär standard. Ich hab jetzt versucht eine von diesen rounds zu verwenden, aber da krieg ich immer nur 0 zurück! Auch meine eigene kleine round-funktion

    double round( double d )
    {
    	return floor( d + 0.5 );
    }
    

    liefert komischerweise immer nur 0 zurück. N plan warum?

    Edit: Daran kann's ja nicht liegen. Der fehler liegt vorher im Code



  • Die 0 kommt aus der Rechnung, hier der Code

    double recentPspVolume;
    
    recentPspVolume = (recentVolume/255)*53;
    

    Warum ist recentPspVolume immer 0?



  • Es ist zum Mäusemelken! Gebt euch das:

    int recentVolume;
    double recentPspVolume;
    char send_buffer[192];
    
    recentVolume = SendMessage(plugin.hwndParent, WM_WA_IPC, -666, IPC_SETVOLUME);	// Holt sich die Lautstärke von Winamp
    wsprintf(send_buffer, "Volume is now %i", recentVolume);
    MessageBox(plugin.hwndParent,send_buffer,"",MB_OK);				// MsgBox; Asugabe: "Volume is now 82"
    
    recentPspVolume = (recentVolume/255)*53;
    wsprintf(send_buffer, "PSP-volume is now %d", recentPspVolume);
    MessageBox(plugin.hwndParent,send_buffer,"",MB_OK);				// // MsgBox; Asugabe: "PSP-volume is now 0"
    

    Ich kapier's nicht


  • Administrator

    (int / int) * int = int 😉

    Schreib doch mal die Rechnung so:

    recentPspVolume = (recentVolume / 255.0) * 53.0;
    

    Das .0 bewirkt, dass die Zahl nicht als int, sondern als double angesehen wird. Wenn du sie als float möchtest, dann müsstest du folgendes machen:

    (recentVolume / 255.0f) * 53.0f;
    

    Das .0f bewirkt, dass die Zahl als float angesehen wird 😉

    Grüssli



  • double recentPspVolume = (static_cast<double>(recentVolume) / 255.0) * 53.0;
    

    ?



  • Super! Das hat mich schon mal nen entscheidenden Schritt weitergebracht! Danke!

    Aber ich krieg noch fehler:

    error C2065: 'static_cast': nichtdeklarierter Bezeichner
    error C2059: Syntaxfehler: 'Typ'

    😕



  • Hmm programmierst du in C oder was? Wenn ja dann ersetz static_cast<double>(recentVolume) durch (double)recentVolumn 😉



  • Hm, google hilft mir nicht wirklich weiter. Was genau ist der unteschied zwischen nem static_cast und nem einfachen typecast?

    Edit: Crosspost 😕



  • naja static_cast hast du unter C nicht zur verfügung ... da musst du nen C-Style-Cast nehmen ...

    double recentPspVolume = (((double)recentVolume) / 255.0) * 53.0;
    


  • Ok, danke für eure Hilfe. Eine letzte Frage noch (und ja, haut mich ruhig für mein Newbie-tum). Ich will das Double in eine char[256] Variable packen. Dafür mach ich

    wsprintf(send_buffer, "PSP-volume is now %lf", recentPspVolume);
    

    aber ich bekomm nur "PSP-volume is now f" raus. Wie stell ich's richtig an?



  • Auch mit

    wsprintf(send_buffer, "PSP-volume is now %.2f", recentPspVolume);

    und

    wsprintf(send_buffer, "PSP-volume is now %2.10f", recentPspVolume);

    nur

    "PSP-volume is now f"

    Ich versteh's nicht

    edit: Jetzt hab ich folgendes versucht:

    char *send_buffer;
    int pspVolumeDecPointPos, pspVolumeDecPointSign;
    
    recentPspVolume = round(13.6);
    
    send_buffer = _fcvt(recentPspVolume, 1, &pspVolumeDecPointPos, &pspVolumeDecPointSign);
    

    Und jetzt kackt er in der Laufzeit mit der Meldung "The variable 'send-buffer' is being used without being defined"


Anmelden zum Antworten