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 structure

    int 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 126

    Program.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^^


Anmelden zum Antworten