_Faby_ Geschrieben 13. April 2011 Geschrieben 13. April 2011 (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... 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 Bearbeitet 13. April 2011 von _Faby_ Zitieren
Kaeyu Geschrieben 13. April 2011 Geschrieben 13. April 2011 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 Zitieren
Klotzkopp Geschrieben 14. April 2011 Geschrieben 14. April 2011 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? Zitieren
_Faby_ Geschrieben 14. April 2011 Autor Geschrieben 14. April 2011 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... Zitieren
Klotzkopp Geschrieben 14. April 2011 Geschrieben 14. April 2011 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. Zitieren
_Faby_ Geschrieben 14. April 2011 Autor Geschrieben 14. April 2011 (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 14. April 2011 von _Faby_ Zitieren
Klotzkopp Geschrieben 14. April 2011 Geschrieben 14. April 2011 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. Zitieren
_Faby_ Geschrieben 14. April 2011 Autor Geschrieben 14. April 2011 (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 14. April 2011 von _Faby_ Zitieren
_Faby_ Geschrieben 14. April 2011 Autor Geschrieben 14. April 2011 Okay die Frage wegen dem abbrechen hat sich auch erledigt einfach nur return^^ naja Danke auf jeden Fall nochmal Zitieren
Empfohlene Beiträge
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.