Bug in C++ Builder 5 - Ungültige Gleitkommaoperation?



  • akari schrieb:

    Ich meine die vielen Tage die du nun schon den Fehler suchst hättest du besser investieren sollen um das Programm so umzuschreiben das du ohne globale Variablen auskommst.

    Toller Vorschlag akari!
    Habe aber schon (fast) alle globalen Variablen durch Klassenvariablen ersetzt. Habe ich auch in diesem Thread bereits so geschrieben. Lediglich die Konstanten sind noch global!

    Aber nun zurück zur Problematik.
    Ich habe mal die Sache ohn vorcompilierten Headern getestet (ausgeschaltet). Leider ohne Erfolg.

    Dann habe ich mal die Assemblerbefehle angesehen. Sehr interessant!
    Der Compiler wurschtelt irgendwie ein AnsiString zwischen die double Befehle.
    Ich habe die Screenshots mit Codesnippet und Assembler einmal hier hochgeladen:

    1. Codesnippet direkt in der WinMain nachdem der Fehler auftritt:
    http://www.siteupload.de/p834614-problemassemblerGIF.html

    2. Direkter Vergleich wenn alles neu compiliert (der Code aber nicht verändert):
    http://www.siteupload.de/p834619-problemassemblerOKGIF.html

    Viele Grüße
    jf_stgt

    PS.: Unter den Links gibt es ein Download Datei (gif) unter dem man den Screenshot in besserer Qualität herunterladen kann falls diese in der Voransicht zu schlecht ist.



  • Hallo

    jf_stgt schrieb:

    Habe aber schon (fast) alle globalen Variablen durch Klassenvariablen ersetzt. Habe ich auch in diesem Thread bereits so geschrieben. Lediglich die Konstanten sind noch global!

    Warum sind die noch global? Zumal es keine Konstanten sind, sondern Variablen. Konstanten wären sie erst wenn sie mit "const" deklariert werden.

    bis bald
    akari



  • akari schrieb:

    Hallo
    Warum sind die noch global? Zumal es keine Konstanten sind, sondern Variablen. Konstanten wären sie erst wenn sie mit "const" deklariert werden.

    Der (programmiertechnische) Unterschied zwischen Variablen und Konstanten ist mir klar! Diese Variablen werden in der ersten Form aus einer Ini-Datei eingeladen und danach nur noch lesend verwendet. Aber zur Sicherheit habe ich diese eben mal auskommentiert. Wie zu erwarten war ist der Fehler immer noch da. Wie erwähnt - nun keine globalen Variablen mehr (und auch keine Konstanten)!

    Hat jemand Ahnung von Assembler und kann sich mal meine beiden Links oben ansehen? Ist doch seltsam, oder?



  • jf_stgt schrieb:

    Hat jemand Ahnung von Assembler und kann sich mal meine beiden Links oben ansehen? Ist doch seltsam, oder?

    Das ist in der Tat aufschlußreich.
    Sieht aus, als handelte es sich um einen Bug im inkrementellen Linker (den hatte ich in C++Builder 2006 auch zuweilen noch mit Template-Funktionen). Deaktiviere das inkrementelle Linken einfach mal in den Projektoptionen.



  • Offensichtlich hast Du ein sehr ernstes Speicherproblem !!!
    Dein Programm scheint "illegal" auf falsche Speicherstellen zu schreiben.

    - Greifst Du ev. bei Arrays vor oder hinter die Grenzen zu?
    - Nutzt Du NICHT richtig initialisierte Zeiger- Variablen?
    - Nutzt Du Zeigervariablen mit falschem Typ (Zugriff auf falsche Adressen)?

    Gruss
    Frank

    PS: 20 Formulare -> 8 MByte. Mit vielen Ressourcen schon ok.
    (Ich hab eins mit 25 Formularen -> 2.5 MB, braucht auch Zeit zum Compilieren)



  • audacia schrieb:

    jf_stgt schrieb:

    Hat jemand Ahnung von Assembler und kann sich mal meine beiden Links oben ansehen? Ist doch seltsam, oder?

    Das ist in der Tat aufschlußreich.
    Sieht aus, als handelte es sich um einen Bug im inkrementellen Linker (den hatte ich in C++Builder 2006 auch zuweilen noch mit Template-Funktionen). Deaktiviere das inkrementelle Linken einfach mal in den Projektoptionen.

    Den inkrementellen Linker habe ich schon lange deaktiviert. Trotzdem Danke für den Tipp. Was könnte es noch sein?

    DerAltenburger schrieb:

    Offensichtlich hast Du ein sehr ernstes Speicherproblem !!!
    Dein Programm scheint "illegal" auf falsche Speicherstellen zu schreiben.
    - Greifst Du ev. bei Arrays vor oder hinter die Grenzen zu?
    - Nutzt Du NICHT richtig initialisierte Zeiger- Variablen?
    - Nutzt Du Zeigervariablen mit falschem Typ (Zugriff auf falsche Adressen)?

    Gruss
    Frank

    Das kann eigentlich nicht das Problem sein, da ich mein "Problemcode" ja direkt nach der WinMAIN aufrufe und dort schon das Problem auftaucht.
    Jetzt ist die ungültige Gleitkommadivision auch bei einem Kunden in einem anderen Formular aufgetaucht.
    Eine Neuinstallation des BCB hat das Problem übrigens nicht behoben.
    Grrr.



  • Die beiden Disassembler-Screenshots deuten mit großer Sicherheit darauf hin, daß es sich um einen Linker-Bug handelt. In beiden Fällen wird exakt derselbe Code generiert, doch an der Zieladresse scheint sich im einen Fall eine Double-Variable, im anderen Fall der AnsiString-Konstruktor zu befinden.

    Hast du möglicherweise Zugriff auf einen etwas aktuelleren C++Builder? In allen Folgeversionen, auch in C++BuilderX, wurden eine Menge Linkerfehler behoben. Du mußt dein Projekt auch gar nicht gleich vollständig migrieren; es sollte reichen, wenn du die ilink32.exe des C++Builder 5 sicherst und durch die aktuellere Version ersetzt.

    Falls du keine neuere C++Builder-Version hast, versuche es mit dem Linker aus Turbo C++ Explorer oder aus der C++Builder 2007-Trial.



  • audacia schrieb:

    Die beiden Disassembler-Screenshots deuten mit großer Sicherheit darauf hin, daß es sich um einen Linker-Bug handelt. In beiden Fällen wird exakt derselbe Code generiert, doch an der Zieladresse scheint sich im einen Fall eine Double-Variable, im anderen Fall der AnsiString-Konstruktor zu befinden.

    Hast du möglicherweise Zugriff auf einen etwas aktuelleren C++Builder? In allen Folgeversionen, auch in C++BuilderX, wurden eine Menge Linkerfehler behoben. Du mußt dein Projekt auch gar nicht gleich vollständig migrieren; es sollte reichen, wenn du die ilink32.exe des C++Builder 5 sicherst und durch die aktuellere Version ersetzt.

    Falls du keine neuere C++Builder-Version hast, versuche es mit dem Linker aus Turbo C++ Explorer oder aus der C++Builder 2007-Trial.

    Hallo audacia,

    Du bist der Held! 😉
    Habe auch eine C++ Builder 2007 Variante und habe da den Linker gleich am Montag probiert. Bisher läuft er ohne den Fehler. Ich möchte mal noch keine Entwarnung geben aber im Moment sieht es echt so aus wie wenn es tun würde. Danke für eure Hilfe!
    Auf lange Sicht möchte ich das Projekt eh nach BCB 2007 migrieren, aber das ist wegen den Komponenten sehr aufwendig.

    Gruß
    jf_stgt



  • jf_stgt schrieb:

    Du bist der Held! 😉
    Habe auch eine C++ Builder 2007 Variante und habe da den Linker gleich am Montag probiert. Bisher läuft er ohne den Fehler.

    Hallo!

    Also habe das Projekt erstmal weggelegt, da ich etwas anderes tun musste.
    Also der Fehler ist immer noch da. Ich könnte k...
    Hat noch jemand einen Tipp!
    Es tritt sporadisch immer wieder auf sobald ich ein paar Komponenten hinzufüge oder Funktionen einfüge.
    Es muss doch ein Fehler im Linker sein, oder? Es neu compilieren des ganzen Projektes löst das Problem (mit vorherigem weglöschen der temp. Dateien (obj, il*, ...)). Aber das kann ja nicht die Lösung sein.

    Gruß
    jf_stgt



  • Es könnte auch ein sehr seltsames Problem mit dem Compiler-Backend sein.
    Versuche doch mal, das Programm in C++Builder 2007 oder 2009 zu übersetzen.


Anmelden zum Antworten