Laufzeitfehler ausserhalb des Debuggers



  • Hallo,

    ich habe eine kleine Dialog-Anwendung mit Hilfe der WinAPI (ohne MFC) programmiert.

    Auf meinem Dialog finden sich einige Textfelder in welche ich Zahlen vom Typ double schreibe.

    Dafür habe ich mir folgende Funktion geschrieben:

    bool setEditValue_double(double val, int item)
    {
    
    	if(mainDlg!=NULL)
    	{
    		TCHAR * value;
    		value=(TCHAR *)malloc(sizeof(val));
    		_sntprintf(value,sizeof(val),_T("%f"),val);
    		return SetDlgItemText(mainDlg, item, value);
    	}
    	else return false;
    }
    

    Diese verwende ich mehrfach in meinem Programm.

    Es läuft alles ganz gut, die Zahlen werden korrekt in den Textfeldern dargestellt.

    Da das Programm nun eigentlich fertig ist, habe ich mal versuch die EXE ausserhalb des Debuggers auszuführen. Sie stürzt jedoch ab und es gibt einen Laufzeitfehler.

    Ich konnte die Ursache soweit eingrenzen, dass es wohl an obiger Funktion liegt. Jedoch tritt der Fehler nicht beim 1. , sondern erst nach mehrmaligem Aufrufen auf.

    An den Parametern kann es eigentlich nicht liegen, da alle Zahlen vom Typ double sind und mehr als die angezeigten 6 Nachkommastellen besitzen.

    Ich habe auch schon andere Versionen von printf verwendet, wie etwa swprintf(), _stprintf() etc pp.

    Ich hoffe ihr könnt mir sagen woran das liegt.

    MfG



  • value=(TCHAR *)malloc(sizeof(val));  // <- Kommt mir komisch vor!
    

    Wieso sizeof(val)? Ich hätte da eher nen sizeof(TCHAR)*LängeDerZeichenkette erwartet?
    Rufst du auch irgendwo noch free() dafür auf?



  • Hi,

    hast recht, dort sollte eigentlich sizeof(TCHAR) stehen, hat komischerweise bisher auch so funktioniert.

    Das free() habe ich rausgenommen weil ich dachte es läge daran, war es aber wohl nicht.

    Gibts noch weitere Idee? Ich weiß da momentan nicht weiter ...

    MFG



  • Wenn mir niemand sagen kann woran es liegt, kann mir dann jemand sagen wie ich es anders machen könnte damit es funktioniert? Wie würdet ihr denn einen Double in ein Textfeld schreiben?

    MfG



  • SuPeRpLuS schrieb:

    dort sollte eigentlich sizeof(TCHAR) stehen

    Dort sollte sizeof(TCHAR)*10000 stehen.
    10000 ist vllt. etwas übertrieben, so lang wird wohl dein double vermutlich nicht sein 😉

    Ansonsten würde ich free() wieder einbauen. free() crashed im Debug-Modus dann normalerweise wenn Blödsinn mit dem Zeiger gemacht wurde (Buffer-Overruns etc.) und man erhält meist weitere Infos (je nach Compiler-Einstellung)



  • Verwende doch bitte "new TCHAR[val]" anstelle von malloc!!!



  • Danke, jetzt klappt es!

    Aber ist es nicht eigentlich egal, wie ich den Speicher adressiere? ob mit new oder malloc()?

    Wo ist da der Unterschied?

    MfG


Anmelden zum Antworten