Problem mit Überlauf



  • Hallo,
    ich bekommen aus einer DLL einen 4 Byte wert geliefert. Jedoch läuft dieser öfters über. Den Wert immer zwischenzuspeichern ist nervig, kennt jemand eine bessere Möglichkeit?

    danke

    PS: Verschiebt den Thread nicht gleich in WinApi nur weil da DLL steht. Es ist ein C++ Problem!



  • Überläufer schrieb:

    Hallo,
    ich bekommen aus einer DLL einen 4 Byte wert geliefert. Jedoch läuft dieser öfters über.

    überlaufen kann er nur bei dir. bei was genau läuft er über?
    oder kriegste von der dll öfters einen offensichtlich bereits übergelaufenen wert?



  • volkard schrieb:

    oder kriegste von der dll öfters einen offensichtlich bereits übergelaufenen wert?

    genau dieser fall tritt auf. Der Datentyp ist ein DWORD (=4byte -> von -2147483648 bis 2147483647)


  • Mod

    DWORD ist üblicherweise vorzeichenlos definiert



  • camper schrieb:

    DWORD ist üblicherweise vorzeichenlos definiert

    achja und wieso kommt dann nach überschreiten des Wertes 2147483647
    -2147483647 bzw. eine negative Zahl raus?



  • Überläufer schrieb:

    achja und wieso kommt dann nach überschreiten des Wertes 2147483647
    -2147483647 bzw. eine negative Zahl raus?

    Wahrscheinlich, weil _du_ den Wert in einen (signed) int oder long umwandelst. Zeig mal den Code, der dir -2147483647 ausgibt.



  • void CMyDlg::OnTimer(UINT nIDEvent)
    {
        DWORD value = GetValueFromDll();
    ....
    }
    DWORD CMyDlg::GetValueFromDll()
    {
        DWORD dllvalue;
        //LoadLibrary etc.
    ...
        return dllvalue;
    }
    

    es findet also keine Konvertierung statt!



  • Außerdem hat das nichts mit den eigentlichen Thema zu tuen! Ich wollte nur wissen ob es da eine einfachere und weniger aufwendige Möglichkeit gibt überläufe zu erkennen bzw. zu verhindern



  • wenn du einen DWORD bekommst, dann kann da auch nichts überlaufen. ausser du addierst etwas zur variable. dann könntest du z.b. einen größeren datentyp nehmen. aber erstmal könnte es - wie schon erwähnt - helfen, den wert als "unsigned" zu behandeln.



  • Überläufer schrieb:

    es findet also keine Konvertierung statt!

    Den wichtigen Teil des Codes hast du nicht gepostet. Was geschieht mit value, dass du -2147483647 erhältst? Im Debugger steht dieser Wert ja wohl nicht, oder?

    Überläufer schrieb:

    Außerdem hat das nichts mit den eigentlichen Thema zu tuen!

    Wenn du den Wechsel von 2147483647 nach -2147483647 als Überlauf betrachtest, hat das sehr wohl etwas mit dem Thema zu tun.

    Allgemein: Wenn der Wert immer nur größer werden kann, dann hat ein Überlauf stattgefunden, wenn der aktuelle Wert kleiner ist als der vorherige Wert. Der Umkehrschluss gilt übrigens nicht.


Anmelden zum Antworten