Zum Inhalt springen

Empfohlene Beiträge

Geschrieben (bearbeitet)

Hallo zusammen...

Ich habe ein Problem mit meinem C programm...

Es ist eine MFC application...

Das Programm ist fertig und wurde von mir auf "Release" gestellt kompiliert und jetzt funktioniert die Funktion UpdateData() nicht mehr :( Woran kann das liegen?

Statt den eingegebenen Werten werden total wahllose werde eingesetzt...

post-74439-14430448982987_thumb.jpg

m_seku bzw m_hour bzw m_minu sind die Variablen für die Editfelder.

Kann mir bitte jmd helfen??

mfg

_Faby_

EDIT: Kann bitte ein Moderator meinen Beitrag kurz verschieben?? Hab erst danach gesehen dass es dafür ein extra Themengebiet gibt... SORRY

post-74439-14430448982805_thumb.jpg

Bearbeitet von _Faby_
Geschrieben

Hi Faby,

was genau heißt von Dir auf "Release" gestellt kompiliert?

Und wann genau werden die Werte in die Variablen geschrieben? Quelltext für diese Aktion wäre natürlich nice ;)

LG

~Kae

Geschrieben
Das Programm ist fertig und wurde von mir auf "Release" gestellt kompiliert und jetzt funktioniert die Funktion UpdateData() nicht mehr :( Woran kann das liegen?
Wenn etwas in der Debug-Konfiguration funktioniert, aber als Release nicht mehr, ist der Grund fast immer schlampige Programmierung.

Die Ursachen können vielfältig sein. Bereichsüberschreitungen bei Arrays, uninitialisierte Variablen, fehlende Threadsynchronisierung. Allgemein alles, was undefiniertes Verhalten erzeugen kann.

Kompiliert dein Code ohne Warnungen?

Geschrieben

Es werden keine Warnungen angezeigt...

void CSkype_Time_AddDlg::OnBnClickedButtonadd()

{

	UpdateData(true);

	bool exists = true;

	FILE* fp = _tfopen(_T("C:\\test.txt"), _T("r+"));//r+ lesen und schreiben -> Datei muss existieren

	fseek (fp, 0, SEEK_END);

	int size = ftell (fp);

	fseek(fp, 0, SEEK_SET);

	if(size == NULL)

		exists = false;

            TCHAR buffer[4][1024];//TCHAR für die Zeit in TCHAR-Format

	int time[3];//int für die Zeit in integer-Format

	int i = 0;//zähler

	if(exists == true)

	{

		TCHAR* p = _fgetts(buffer[i], 1024, fp);//auslesen und auf buffer[0] speichern

		CString token = strtok(buffer[i], ":");//token "zerstückeln" den Text in buffer[0]

		while(token != "")

		{

			i++;

			strcpy(buffer[i], token);//buffer[1],[2],[3] werden mit den Token gefüllt

			token = strtok(NULL, ":");//-"-

		}

		i = 1;

		int v = 0;

		while(i <= 3)

		{

			time[v] = atoi(buffer[i]);//die einzelnen buffer werden per atoi in integer umgewandelt

			v++;

			i++;

		}

		bool more = morethansixty();//mehr als 60 ist unzulässig -> 60 minuten/stunde

		if(more == false)//wenn es unter 60 ist

		{

			m_seku += time[2];//eingegebene Zahl wird hinzugezählt

			m_minu += time[1];

			m_hour += time[0];

			convert();//wenn das ergebnis über 60 liegt wird Konvertiert

		}

	}

	else

		MessageBox("Please write an correct number of seconds or minutes into the field", "FAIL!!! xP", MB_OK|MB_ICONSTOP|MB_SETFOREGROUND); //Fehlermeldung wenn das eingegebene über 60 liegt

	TCHAR puffer[5][1024];//TCHAR-array für die ergebnisse der rechnungen

	_stprintf(puffer[0], _T("%d"), m_hour);

	_stprintf(puffer[1], _T(":"));

	if(m_minu<10)

		_stprintf(puffer[2], _T("0%d"), m_minu);//wenn die Zahl unter 10 ist eine 0 vorne anhängen

	else

		_stprintf(puffer[2], _T("%d"), m_minu);

	_stprintf(puffer[3], _T(":"));

	if(m_seku<10)

		_stprintf(puffer[4], _T("0%d"), m_seku);

	else

		_stprintf(puffer[4], _T("%d"), m_seku);

	int t = 0;

	fseek(fp, 0, SEEK_SET);//Position im File wird auf anfang gestellt(!!!NEU!!!)

	for(t; t<=4; t++)

	{

		_fputts(puffer[t], fp);//File wieder füllen -> vorheriger Inhalt wird überschrieben

	}

	m_seku = 0;//Felder werden mit 0 gefüllt

	m_minu = 0;

	m_hour = 0;

	fclose(fp);//File wird geschlossen

	Write_Sum();//Summe wird aktualisiert

	UpdateData(false);//Oberfläche wird aktualisiert

void CSkype_Time_AddDlg::convert()

{

	if(m_seku>60)

	{

		m_minu += m_seku/60;

		m_seku = m_seku%60;

	}

	if(m_minu>60)

	{

		m_hour += m_minu/60;

		m_minu = m_minu%60;

	}

}

}
Das Problem ist das erst UpdateData() Die Werte werden einfach NICHT EINGELESEN^^ Was soll ich da falsch Programmiert haben? Hier noch die Header datei:
class CSkype_Time_AddDlg : public CDialog

{

// Construction

public:

	CSkype_Time_AddDlg(CWnd* pParent = NULL);	// standard constructor


// Dialog Data

	enum { IDD = IDD_SKYPE_TIME_ADD_DIALOG };


	protected:

	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support

private:

	bool morethansixty(void);

	void convert(void);

	void Write_Sum(void);


// Implementation

protected:

	HICON m_hIcon;


	// Generated message map functions

	virtual BOOL OnInitDialog();

	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

	afx_msg void OnPaint();

	afx_msg HCURSOR OnQueryDragIcon();

	DECLARE_MESSAGE_MAP()

public:

	int m_hour;

	int m_minu;

	int m_seku;

	afx_msg void OnBnClickedButtonadd();

	CString m_sum;

	afx_msg void OnBnClickedOk();

	virtual BOOL PreTranslateMessage(MSG* pMsg);

	bool saveButtonHasFocus;

};

Hab gemeint vllt liegt es an irg welchen Einstellungen in VS aber ich denk mal des kann ich vergessen... :(

Geschrieben

Der Fehler liegt in der Regel nicht an der Stelle, an der er sich bemerkbar macht. Wenn du dir irgendwo den Stack oder den Heap zerschießt, merkst du das möglicherweise erst viel später, an einer Stelle, die damit gar nichts zu tun hat.

Dein Code ist sehr anfällig für Pufferüberläufe und Indexüberschreitungen. Die Klassen der C++-Standardbibliothek könnten dich da schützen, aber du benutzt überwiegend Funktionen, die aus C stammen.

Der Code sieht eher wie "C mit Klassen" aus, nicht wie C++. An etlichen Stellen fehlen Fehlerbehandlung und Sicherheitsprüfungen. Du prüfst beispielsweise nicht, ob fopen erfolgreich war. In der strtok-Schleife stellst du nicht sicher, dass i nicht zu groß wird.

Prüf die Rückgabewerte von Funktionen, die fehlschlagen können. Und prüf bei jedem Array-Zugriff, ob der Index im gültigen Bereich ist. Nicht nur in dieser Funktion, sondern im ganzen Programm.

Geschrieben (bearbeitet)

Wie kann eis ein Problem sein das irg wo im Programm liegt wenn ich als ERSTE Funktion UpdateData() aufruf und die fehlschlägt?? Und ich habe leider keine Ahnung von C++ bzw nich so wirklich mir wurde es bis jetzt nur so beigebracht und es hat bis jetzt immer funktioniert xD

fopen hab ich kontrolliert habs nur rausgenommen weil ich gemeint hab is nich so wichtig...

i kann doch so groß werden wie es will die Schleife eh abgebrochen wird wenn des strtok nix zurückliefert, oder?

Sorry wenn ich mich bissal doof anstell :S

Bearbeitet von _Faby_
Geschrieben

Woher stammen denn diese kaputten Werte? Zeigt die der Debugger an? In der Release-Konfiguration ist Debuggen nicht immer verlässlich. Tut das Programm denn ansonsten, was es soll?

i kann doch so groß werden wie es will die Schleife eh abgebrochen wird wenn des strtok nix zurückliefert, oder?

Wenn i größer als 3 wird, erzeugt der Zugriff auf buffer undefiniertes Verhalten.

Wenn i kleiner als 3 bleibt, erzeugt der nachfolgende Zugriff auf buffer mit atoi undefiniertes Verhalten, weil nie etwas in buffer reingeschrieben wurde.

Du verlässt dich hier einfach darauf, dass das Einlesen aus der Datei klappt und dass die Daten genau das Format haben, das du erwartest.

Geschrieben (bearbeitet)

OOOH damn :( des hab ich nich beachtet... danke!!

die Werte werden in dem "Watch" fenster angezeigt...

kann ich das einfach so machen dasss ich schreib:

while(i!=3)

		{

			i++;

			strcpy(buffer[i], token);//buffer[1],[2],[3] werden mit den Token gefüllt

			token = strtok(NULL, ":");//-"-

		}

		if(buffer[3] == "")

{

			_tprintf(_T("FEHLER"));

}

bzw wie mach ich das, dass das Programm geschlossen wird, oder die Restlichen Funktionen einfach nicht ausgeführt werden?? weil mit return 1 geht das ja nicht bei einer void Funktion... (das wollt ich schon lang mal wissen)

Du hattest Recht was den Debugger angeht... Er hat einen totalen Käse angezeigt... habs grad nochmal ausprobiert... Trotz der Tatsache dass komische werte im Watch fenster stehen funktioniert das ganze :((( Tut mir leid wenn ich damit deine Zeit in kauf genommen habe...

Bearbeitet von _Faby_

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...