Seite 1 von 1

[gelöst] unknown software exception ...

Verfasst: 26. April 2005 17:09
von Flachkoepper
Mahlzeit,

ich habe mal wieder ein Problem und hoffe, das mir wer helfen kann. Also, ich habe diverse double-zahlen:

Code: Alles auswählen

 
double minX, maxX, xFactor, diffX;
diffX = maxX - minX;

xFactor = ( (double)width() ) / diffX; 
Wenn das Programm an die Stelle xFactor = ... kommt, bricht es mit einer "unknown software exception" ab. Die doubles existieren alle und sehen auch genauso aus, wie sie sollen, width() liefert auch den richtigen Wert zurück und es findet auch keine Division durch Null statt. Ich benutze Qt 3.3.4 mit dem Borland-Compiler Version 5.6.4 unter Windows XP SP2. Da ich schon an einen Compiler-Fehler dachte, habe ich das ganze unter HP-UX mit aCC kompiliert und dort funktioniert alles ohne Probleme. Irgendwer Erfahrung mit dem bcc32, der mir vielleicht helfen könnte?

Viele Grüße,
Flachkoepper

Verfasst: 27. April 2005 06:50
von Christian81
und mit welchen Werten wird minX und maxX initialisiert?

Verfasst: 27. April 2005 08:46
von Flachkoepper
In diesem Fall minX=0 und maxX=5000. Im allgemeinen kann es allerdings auch jeder andere double-Wert sein.

Flachkoepper

Verfasst: 27. April 2005 09:00
von Christian81
Mhhh
Ich habe Borland daheim - wenn du ein kleines Beispielprogramm schreiben willst, kann ich es mal testen. Bzw. du kannst ja mal ein kleines Proggie schreiben, das nur diese Division durchführt und dann schauen. Aber ich denke nicht, dass es an diesen Zeilen liegt. Was für eine Qt-Version benutzt du überhaupt? Von kde-cygwin oder original? Was passiert, wenn Du width() durch eine Konstante ersetzt bzw. das Ergebnis von width() erst in eine Variable schreibst?

Verfasst: 27. April 2005 09:54
von Flachkoepper
So,
ich habe jetzt das ganze Programm mal auf diese wichtige Division gekürzt, und derselbe Fehler taucht immer noch auf. Auch wenn ich mir vorher alle Werte in einer anderen Variable zwischenspeicher. Und wenn ich diese Division auskommentiere, ist alles wunderbar. Ich habe das Programm mal als .zip (inclusive der Datei, aus der ich meine Daten hole) rangehängt. Ist übrigens aus dem Suse-QT-Buch von Helmut Herold. Ich benutze desweiteren eine QT-Enterprise-Edition für teuer Geld. Vielleciht fällt ja irgendwem irgendwas auf.

Viele Grüße,
Flachkoepper

Verfasst: 27. April 2005 11:38
von Goos
Wenn der Fehler da bei dir immernoch auftaucht, dann liegts sicherlich nicht an diesem Code....bei mir funktioniert er. Sind vielleicht am ende irgendwelche Projekteinstellungen, oder ein Compilerfehler. Hast auch alles mal komplett neu neu geladen und erstellt und solche Spielchen?
Der Code den du gepostet hast funktioniert :)

Goos

Verfasst: 27. April 2005 18:00
von Christian81
Ganz einfach - deine Variablen minX und maxX sind uninitialisiert. Mit msvc geht es, da dort minX und maxX nicht auf 0 sondern auf irgend einen (zufälligen?) Wert gesetzt werden.

Verfasst: 3. Mai 2005 09:41
von Flachkoepper
Morgen,

also das sehe ich nicht so, sie werden ja sauber rechtzeitig initialisiert. Übrigens taucht der Fehler auch auf, wenn ich maxX direkt davor initialisiere:

maxX = 5000;
xFactor = ( (double)width() ) / maxX;

Und dies sollte ja nun wohl definitiv klappen (klappt ja auch unter allen anderen Compilern, die ich irgendwo auftreiben konnte).
Vielen Dank für eure Mühe aber ich denke ich werde mich mal vertrauensvoll an Borland wenden.

Schönen Tag noch,
Flachkoepper

Verfasst: 3. Mai 2005 09:47
von Christian81
Schade, das wäre eine Erklärung gewesen (die mich schon öfter genarrt hat). g++ initialisiert (zumindest in cygwin,debug) alles mit 0. Als ich es dann mit msvc ausprobiert hatte (der code war nicht von mir) Klappt gar nichts und ich wunderte mich wie es überhaupt jemals gelaufen sein sollte.
Werde mir mal den Asssembler-Output anschauen. Evtl. zeigt uns der wo das Problem steckt.

Verfasst: 4. Mai 2005 09:23
von ArneStocker
ich will ja nicht unken, aber solange Du nicht 100% sicher sein kannst, dass diffX ungleich Null ist solltest Du folgenden Programmcode schreiben :

Code: Alles auswählen

if (diffX != 0)
{
	xFactor = ( (double)width() ) / diffX; 
}
else
{
	// hier ist was ganz schreckliches passiert 
}
Zumindest solltest Du eine ASSERT vorschalten

Code: Alles auswählen

	ASSERT(diffX != 0)
	xFactor = ( (double)width() ) / diffX; 
Die erstere Variante ist bereits deshalb vorzuziehen, weil Dir ansonsten bei späteren Änderungen des Programmes (wenn Du Deine Anfangswerte schon vergessen hast) böse Seiteneffekte auftreten können.

Grundsätzlich kann es auch nicht schaden, jedem Wert einen Anfangswert zuzuweisen. also z.B:

Code: Alles auswählen

	double minX = 0, maxX = 500, xFactor = 0, diffX = 0; 
	diffX = maxX - minX; 
 	...
Ich habe in Deinem Programmcode z.B. nicht entdeckt, wo Du minX initialisiert hast. Also kann maxX - minX auch 0 sein. An einen Compilerfehler mag ich da nicht glauben. Aber das Verhalten beim initialisieren der Variablen ist z.B. auch bei msvc unterschiedlich (Debug - modus oder Release - modus).

Probier es doch einfach mal aus, wenn es dann klappt, weisst Du zumindest woran es lag. Falls das immer noch nicht klappt (was ich mir nicht vorstellen kann), probier doch mal folgendes aus

Code: Alles auswählen

	double testWidth = width()
	xFactor = testWidth / diffX; 
Gruss Arne

Verfasst: 28. Juni 2005 11:58
von Flachkoepper
Mahlzeit,

habe mich jetzt länger nicht mehr mit dem Problem rumgeschlagen, da ich anderes zu tun hatte. Auf jeden Fall hat es wirklich am initialisieren gelegen. Wenn ich im Konstruktor alle member sauber mit 0 initialisiere, dann (und nur dann) klappt der Code auch mit dem bcc. Mit dem g++ klappt es sogar ohne initialisieren, dann kriege ich allerdings andere Effekte rein. Werde mich also in Zukunft daran halten und alles schön ordentlich mit 0 initialisieren. Auch die Abfragen gehören vollkommen zurecht dazu. Aber daran erkennt man wahrscheinlich den unerfahrenen Programmierer :? Vielen Dank für die ganzen Kommentare. Wieder was gelernt :D

Viele Grüße,
Flachkoepper