unzählige unerklärliche abstürze
-
ich muss für die schule bis donnerstag fertigmachen. allerdings habe ich an für mich unerklärlichen stellen abstürze. z.B. beim aufruf der funktionen Vokabel_eintragen und vokabeln_abfragen. hier ist mal die main.h und die main.cpp wenn ihr noch die defines.h und die rsrc.rc braucht, sagt bescheid^^
[cpp]#include"Main.h"
App Program;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
vector<string> char_dividing(const string& in);
vector<string> dat;
string Vokabeln;
string buffer1;
string buffer2;App::App() //Konstruktorfunktion
{
strcpy(szClassName, "Vokabeltrainer");
}App::~App() //Destruktorfunktion
{
}HWND hWnd; // Window Handle
MSG message; //Messages
WNDCLASSEX wc; //Window class
HMENU menu; // Menu Handle
OPENFILENAME ofn = {}; //OpenFileName structureint App::Vokabeldatei_erstellen()
{
GetSaveFileName(&ofn);
fstream voc(buf, ios::out);
return 0 ;
}int App::Vokabeldatei_oeffnen()
{
GetOpenFileName(&ofn);
fstream voc(buf, ios::in);while(! voc.eof())
{
voc>>tmp1;
voc>>tmp2;
vokabular.insert(pair<string, string> ( tmp1, tmp2));
//Vokabeln = Vokabeln + tmp1 + " = " + tmp2 + "\r\n";}
it = vokabular.begin();
iter = vokabular.begin();
iter++;
while(iter != vokabular.end())
{
if(it->first == iter->first)
{
if(it->second==iter->second)
{
vokabular.erase(it);
}
}
it++;
iter++;
}it = vokabular.begin();
while(it != vokabular.end())
{
Vokabeln = Vokabeln + it->first + " = " + it->second +"\r\n";
it++;
}SetWindowText(GetDlgItem(hWnd, IDC_EDIT_1), Vokabeln.c_str());
UpdateWindow(GetDlgItem(hWnd, IDC_EDIT_1));
return 0;
}*int App::Vokabel_eintragen()
{
Program.iLength1 = GetWindowTextLength(GetDlgItem(hWnd, IDC_EDIT_2));
Program.buffer1 = (char) malloc(Program.iLength1 + 1);
GetWindowText(GetDlgItem(hWnd, IDC_EDIT_2), Program.buffer1, Program.iLength1 + 1);Program.iLength2 = GetWindowTextLength(GetDlgItem(hWnd, IDC_EDIT_3));
Program.buffer2 = (char*) malloc(Program.iLength2 + 1);
GetWindowText(GetDlgItem(hWnd, IDC_EDIT_3), Program.buffer2, Program.iLength2 + 1);for(int i; i <= sizeof(Program.buffer2); i++)
{
if(Program.buffer2[i] == ' ' )
{
Program.buffer2[i] = '_';
}
}dat = char_dividing(Program.buffer2);
buffer1 = Program.buffer1;
buffer2 = Program.buffer2;
Vokabeln = Vokabeln + buffer1 + " = " + buffer2 + "\r\n";
SetWindowText(GetDlgItem(hWnd, IDC_EDIT_1), Vokabeln.c_str());
UpdateWindow(GetDlgItem(hWnd, IDC_EDIT_1));
for(vector<string>::iterator iter=dat.begin();iter != dat.end();iter++)
{
vokabular.insert(pair< string, string> (buffer1, *iter));
}Program.buffer1 = NULL;
Program.buffer2 = NULL;
dat.clear();
return 0;
}****int App::Vokabeln_abfragen()
{
GetOpenFileName(&ofn);
ifstream voc(buf, ios::in);
while(! voc.eof())
{
voc>>tmp1;
voc>>tmp2;
vokabular.insert(pair<string, string> (tmp1, tmp2));}
it = vokabular.begin();
iter = vokabular.begin();
iter++;
while(iter != vokabular.end())
{
if(it->first == iter->first)
{
if(it->second==iter->second)
{
vokabular.erase(it);
}
}
it++;
iter++;
}
while(!vokabular.empty())
{
srand( (unsigned)time( NULL ) );
int iEintraege = vokabular.size();
int zufall;
zufall = (rand()%iEintraege) ;
it = vokabular.begin();for (int i = 0; i < zufall; ++i)
{
++it;}
pair<string , string>(it->first , it -> second);
string tmp3 = it->first; //zeile 125
SetWindowText(GetDlgItem(hWnd, IDC_EDIT_2), tmp3.c_str()); // zeile 126Program.iLength2 = GetWindowTextLength(GetDlgItem(hWnd, IDC_EDIT_3));
Program.buffer2 = (char*) malloc(Program.iLength2);
GetWindowText(GetDlgItem(hWnd, IDC_EDIT_3), Program.buffer2, Program.iLength2);it = vokabular.find(tmp3);
unsigned int count = vokabular.count(tmp3);
if(it == vokabular.end())
{
MessageBox(hWnd, "Vokabel nicht Gefunden.", "Fehler", MB_ICONWARNING | MB_OK);
}if( Program.buffer2 == it->second)
{
MessageBox(hWnd, "Richtig!", "Antwort", MB_ICONINFORMATION | MB_OK);
for( it =vokabular.begin(); it != vokabular.end(); it++)
{
if( it->first == tmp3)
{
vokabular.erase(it);
}
}
}
}return 0;
}**int App::Vokabeldatei_speichern()
{GetSaveFileName(&ofn);
fstream voc(buf, ios::out);for(it = vokabular.begin(); it != vokabular.end(); it++)
{
voc<<it->first<<" "<<it->second<<"\n";
}
return 0;
}vector<string> char_dividing( const string& in)
{
vector<string> erg;for(string::const_iterator iter = in.begin(); iter != in.end(); iter++)
{
if(*iter == ',')
{
erg.push_back(Program.tmp);
Program.tmp = "";
*iter++;
}else
{
Program.tmp += *iter;
}
}erg.push_back(Program.tmp);
Program.tmp = "";
return erg;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
{wc.hInstance = hInstance;
wc.lpszClassName = Program.szClassName;
wc.lpfnWndProc = WndProc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbSize = sizeof(WNDCLASSEX);
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH) COLOR_BACKGROUND;if(!RegisterClassEx(&wc))
{
return 0;
}ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.hInstance = hInstance;
ofn.lpstrFilter = "Vokabeldateien (.voc)\0.voc\0\0";
ofn.lpstrFile = buf;
ofn.nMaxFile = sizeof(buf) / sizeof(*buf);hWnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
Program.szClassName,
"Vokabeltrainer",
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
600,
400,
NULL,
NULL,
hInstance,
NULL);ShowWindow(hWnd, iCmdShow);
menu = LoadMenu(hInstance, MAKEINTRESOURCE(ID_MENU));
SetMenu(hWnd, menu);
//UpdateWindow(hWnd);while (GetMessage (&message, NULL, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}return message.wParam;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{static HBRUSH hBrush; //Brush für den schrifthintergrund
static RECT rect; //Fenstergröße
const char szUeberschrift1[] = "Englische Vokabel:"; // Überschrift für das eingabefelde der englischen vokabel
const char szUeberschrift2[] = "Deutsche Vokabel:"; // Das selbe für die deutsche Vokabel
const char szUeberschrift3[] = "Inhalt der Vokabeldatei:"; // jo, nomal für das dritte editfeld
const char szUeberschrift4[] = "Bereits abgefragte Vokabeln:"; // <-
Program.optionen[0] = FALSE;
//Program.optionen[1] = FALSE;
DWORD d;
switch (message) {case WM_SIZE:
{
rect.left = 0;
rect.top = 0;
rect.right = LOWORD(lParam);
rect.bottom = HIWORD(lParam);
return 0;
}
case WM_COMMAND:
{
switch (LOWORD(wParam))
{
case IDM_NEWVOK:
{
Program.Vokabeldatei_erstellen();
break;
}
case IDM_OPENVOK:
{
Program.Vokabeldatei_oeffnen();
break;}
case IDM_SAVEVOK:
{
Program.Vokabeldatei_speichern();
break;}
case IDM_PRACTICEVOK:
{
Program.Vokabeln_abfragen();
break;
}
case IDM_HELP:
{
MessageBox(hWnd, TEXT("Funktion noch nicht implementiert"), TEXT("Vokabeltrainer"), MB_OK | MB_ICONWARNING);
} break;
case IDM_\1:
{
MessageBox(NULL, TEXT("Vokabeltrainer\nCopyright bei Martin 'Arathorns Sohn' Alsfasser\nDark Grass Software\n
Mit Tatkräftiger Unterstützung von Walljumper bei der Fehlerbeseitigung."), TEXT("Über das Programm"), MB_OK | MB_ICONINFORMATION);
} break;
case IDM_EXIT:
{
PostQuitMessage(0);
} break;
}if (lParam == (LPARAM)GetDlgItem(hWnd, IDC_BTN_INSERT)) {
if (HIWORD(wParam) == BN_CLICKED) {
Program.Vokabel_eintragen();//MessageBox(NULL, TEXT("Funktion noch nicht implementiert"), TEXT("Vokabeltrainer"), MB_ICONWARNING | MB_OK);
}}
} break;
case WM_CTLCOLORSTATIC:
{
if ((HWND) lParam == GetDlgItem(hWnd, IDC_EDIT_1)) {
SetBkColor((HDC)wParam, RGB(255, 255, 255));
return (LRESULT)hBrush;
}
SetBkMode((HDC)wParam, GetSysColor(COLOR_WINDOW));
SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
return 0;
}break;case WM_CTLCOLOREDIT:
{
if((HWND)lParam == GetDlgItem(hWnd, IDC_EDIT_2))
{
SetBkColor((HDC)wParam, RGB(255, 255, 255));
return (LRESULT)hBrush;
}
if((HWND)lParam == GetDlgItem(hWnd, IDC_EDIT_3))
{
SetBkColor((HDC)wParam, RGB(255, 255, 255));
return(LRESULT)hBrush;
}}break;
case WM_CREATE:
{
hBrush = CreateSolidBrush(RGB(255, 255, 255));if(CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE /| ES_READONLY/ | WS_VSCROLL |
ES_AUTOVSCROLL | ES_MULTILINE | WS_HSCROLL | ES_AUTOHSCROLL, 310, 30, 270, 310, hWnd, (HMENU)IDC_EDIT_1, ((LPCREATESTRUCT)lParam)->hInstance,
NULL) == NULL ||CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE, 40, 70, 230, 22, hWnd, (HMENU)IDC_EDIT_2,
((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL ||CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE, 40, 120, 230, 22, hWnd, (HMENU)IDC_EDIT_3,
((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL ||CreateWindowEx( 0, TEXT("button"), TEXT("Eintragen"), WS_CHILD | WS_VISIBLE, 70, 150, 160, 22, hWnd, (HMENU)IDC_BTN_INSERT,
((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL)
{
return -1;
}UpdateWindow(hWnd);
}break;case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;hDC = BeginPaint(hWnd, &ps);
{
SetBkMode(hDC, TRANSPARENT);
TextOut(hDC, 40, 50, szUeberschrift1, sizeof(szUeberschrift1) - 1);
TextOut(hDC, 40, 100, szUeberschrift2, sizeof(szUeberschrift2) - 1);
if (Program.optionen[0] == TRUE)
{
TextOut(hDC, 310, 10, szUeberschrift4, sizeof(szUeberschrift4) - 1);
}
else if(Program.optionen[0] == FALSE)
{
TextOut(hDC, 310, 10, szUeberschrift3, sizeof(szUeberschrift3) - 1);
}}
EndPaint(hWnd, &ps);
}break;case WM_DESTROY:
{
if (hBrush) {
DeleteObject(hBrush);
}
PostQuitMessage (0);
break;
}}
return DefWindowProc(hWnd, message, wParam, lParam);
}[/cpp]
main.h
#include<windows.h> #include<map.h> #include<string> #include<vector> #include<fstream> #include<cstdlib> #include<ctime> #include<time.h> #include"defines.h" using namespace std; TCHAR buf[MAX_PATH] = TEXT(""); class App //Programm Klasse { public: App(); //Konstruktor ~App(); //Destruktor char szClassName[]; //Klassenname int Vokabeldatei_erstellen(); //Funktion zum erstellen einer Vokabeldatei int Vokabeldatei_oeffnen(); //Funktion zum erweitern einer Vokabeldatei int Vokabel_eintragen(); //Funktion um Vokabeln in eine datei einzutragen int Vokabeln_abfragen(); //Funktion zum abfragen von Vokabeln aus einer Vokabeldatei int Vokabeldatei_speichern(); //Funkltion zum spichern der Voakbeldatei unsigned long Error; bool optionen[10]; //0 = Vokabeln abfragen? 1 = speichern?, 2, 3, 4, 5, 6, 7, 8, 9, 10 = unbelegt string tmp; string tmp1; string tmp2; //string tmp3; private: multimap<string, string> vokabular; multimap<string, string>::iterator it; multimap<string, string>::iterator iter; char* buffer1; //Buffer Englische Vokabel int iLength1; //Länge Englische Vokabel char* buffer2; //Buffer deutsche Vokabel int iLength2; //Länge deutsche Vokabel };
-
ok bevor ich dein halbes counterstrike durchlese
um einen fehler zu finden,
von dem ich nichtmal weiß von welcher natur er ist.
poste bitte mit welchem fehler es abstürzt, und grenze den bereich von
vornherein ein, in dem er auftritt (benutze den debugger und führe den
code schritt für schritt aus, oder arbeite mit breakpoints). DANN
markiere den bereich fett in dem der fehler auftritt
-
Hallo,
Ich kann nicht alle Fehler finden, ist einfach sehr unübersichtlich: einige sind mir jedoch aufgefallen:1. Benutze new / delete und nicht malloc / free
2. Wenn Du dynamischen Speicher anfoderst (mit new oder den c- varianten) musst du den Speicher wieder freigeben (mit delete bzw. den c- varianten).
3. Benutze doch std::make_pair(...) um std::pair<..> zu erzeugen.
http://msdn2.microsoft.com/en-us/library/be52dt00(VS.80).aspx
(Ist nur ein Vorschlag).Ansonsten ist das schon ziemlich chaotisch.
Gruss Simon
-
ich weiß, das der code chaotisch ist^^ ich kann leider keinen fehler posten, da es keinen gibt^^ das programm stürzt einfach ab. es passiert nixmehr^^ das mit new und delte hab ich jetzt auch erfahren, aber ich hab keine große lust, dass umzuschreiben^^ ich editir oben den beereich, in dem der fehler kommt^^
edit: edr fehler taucht bei beiden funktionen dort auf. hab aber keine ahnung, warum das ganze nichtmehr als code angezeigt wird, nun wo ich es markiert hab...
-
Also was mir beim drüberfliegen noch aufgefallen ist, dass Du hier:
for(int i; i <= sizeof(Program.buffer2); i++)das 'i' nicht initialisierst. Aber so grausam, wie der Code aussiehst, sind da sicherlich noch viel mehr Fehler drin. Der Debugger (wie ja bereits schon erwähnt) wird Dir sehr weiterhelfen. Du musst natürlich auch auf Debug kompilieren, um auf die Symbolinformationen zugreifen zu können (d.h. der Debugger kann Dir dann den aktuellen Quellcode, der gerade ausgeführt wird anzeigen).
Glaube kaum, dass das so einer für Dich durcharbeiten wird...
-
mal sehen, ob ich was finde... komme mit dem borland turbo c++ debugger net so klar... nja, egal^^ hab jetzt auf jeden fall mal new und delete eingebaut, hat zumindest noch net geklappt^^ aja, was mir noch aufgefallen ist^^ beim aufruf von vokabel_eintragen stürzt er nicht immer abn, sondern nur manchmal^^