[gelöst] unknown software exception ...

Alles rund um die Programmierung mit Qt
Antworten
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

[gelöst] unknown software exception ...

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

und mit welchen Werten wird minX und maxX initialisiert?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag von Flachkoepper »

In diesem Fall minX=0 und maxX=5000. Im allgemeinen kann es allerdings auch jeder andere double-Wert sein.

Flachkoepper
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag 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
Dateianhänge
plot.zip
(9.53 KiB) 156-mal heruntergeladen
Goos
Beiträge: 360
Registriert: 17. August 2004 10:10
Wohnort: Black Forest

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag 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
Flachkoepper
Beiträge: 149
Registriert: 11. Januar 2005 12:14
Wohnort: Hannover

Beitrag 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
Antworten