Problem mit Release-Version
-
Hallo,
Ich habe einen schönen Zeichner für quadratische Funktionen geschrieben, welcher auch gut zu funktionieren schien...
Als er endlich fertig war, und ich von Debug auf Release gewechselt hab, konnte man nur noch einmal einen Graphen zeichnen lassen.
Dann wurde nur noch eine Linie auf meiner x-Achse gezeichnet.
Unter Debug habe ich so ein Problem nicht.
Der Code umfasst ca. 450 Zeilen, und ich weiß nicht, ob es so sinnvoll wäre, ihn hier zu posten?
-
Hört sich nach undefiniertem Verhalten an. Aber ohne konkrete Kenntnisse von deiner Anwendung können wir dir nicht helfen. Versuche das Problem einzugrenzen und dann poste den entsprechenden Code.
-
Überprüfe, ob Du alle Variablen korrekt initialisiert hast.
-
Das Problem liegt sehr warscheinlich beim Einlesen der Werte:
TCHAR* buffer=new TCHAR[GetWindowTextLength(hEdit2A)+1]; GetWindowText(hEdit2A,buffer,static_cast<int>(sizeof(buffer))); a2=static_cast<float>(_wtof(buffer)); delete [] buffer; buffer=new TCHAR[GetWindowTextLength(hEdit2B)+1]; GetWindowText(hEdit2B,buffer,static_cast<int>(sizeof(buffer))); d=static_cast<float>(_wtof(buffer)); delete [] buffer; buffer=new TCHAR[GetWindowTextLength(hEdit2C)+1]; GetWindowText(hEdit2C,buffer,static_cast<int>(sizeof(buffer))); e=static_cast<float>(_wtof(buffer)); delete [] buffer; InvalidateRect(hSecDrawWnd,0,true);hEdit2A bis C sind Edit-Felder.
a2,d und e sind globale Variablen vom typ Float.
Denn wenn diese Variablen 0 sind, ist f(x) ja auch 0 !!!
Daher wird auch nur die x-Achse gezeichnet.
-
Die globalen Variablen a2,d und e sind initialisiert, und zwar so, dass beim Starten der Anwendung eine Normalparabel gezeichnet wird.
-
Normal würde ich ja TRACE vorschlagen, aber das macht in der Release-Version nichts. Alternativ könntest du am Programmanfang ein File (globaler fstream) anlegen und immer mal wieder wichtige Werte dort protokollieren (z.B. die Edit-Inhalte und Umrechnungsergebnisse).
PS: Du könntest auch mal nachsehen, ob eventuell die UNICODE-Einstellung geändert wurde (wo ich gerade TCHAR und _wtof sehe, das könnte Probleme machen in einem ASCII-Build).
-
Ich weiss ja nicht, in welchem Bereich sich deine Werte bewegen. Bei relativ kleinen Werten wird die Umwandlung aber immer 0. Dazu solltest du dir deinen 3. Parameter beim GetWindowText Aufruf anschauen. sizeof liefert immer die Grösse des von der Variablen verbrauchten Speichers. Oder anders gesagt, die Grösse des Typs mit dem die Variable deklariert wurde. Und buffer ist vom Typ TCHAR*, sizeof liefert dir also die Grösse eines TCHAR Zeigers. Du willst aber etwas anderes, nämlich die Anzahl der verfügbaren Ziechen in buffer.
Deshalb, merke dir das Ergebnis von GetWindowTextLength und verwende dies bei GetWindowText. Zusätzlich kannst du diese paar Zeilen nochmal mit dem Debugger durchsteppen und schauen, ob in buffer tatsächlich das ankommt, was du erwartest. Und ob die Umwand in eine Gleitkommazahl auch das gewünschte Ergebnis liefert.Und noch ein Tipp am Rande:
Wie du siehst, machst du für 3 Editfelder codetechnisch genau das Gleiche. Das ist redundant und damit fehleranfällig. Lagere diese kurze Sequenz in eine Funktion mit entsprechenden Parametern aus und rufe diese Funktion dann für jedes Editfeld auf. Damit wird das schön kompakt, übersichtlich und weniger fehleranfällig.
-
Danke für die Antworten.
Jetzt klappt es mit der Release-Version...