Daten in verketteter Liste speichern (viel Code !)



  • In der Schule sollen wir als Referat eine Personaldatenbank schreiben. Eigentlich kein Problem, aber wenn ich nun die Daten aus den Editfelder lese
    und speichern möchte kommt es zum Absturz des Programms.
    Es passiert immer in der Funktion:
    *int Data_Fill(Data pData, HWND hwndButton[NUM])
    Hier also der gekürzte Code:

    /*--------------------- Header Dateien -------------------*/[/b]
    #include <windows.h>
    #include "projekt.h"
    /*--------------------- Header Dateien END ---------------*/
    
    /*--------------------- Prototypen -----------------------*/
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
    int List_Create(List *pList);
    int List_Insert_Listtyp(List *pList);
    int List_Insert_Data(List *pList, Data *pData, int iIndex);
    int List_Delete(List *pList, int iIndex);
    int Data_Fill(Data *pData, HWND hwndButton[NUM]);
    int Data_Show(List *pList, HWND hwndButton[NUM], int iIndex);
    HMENU MainMenu();
    /*--------------------- Prototypen END--------------------*/
    
    /*--------------------- WinMain --------------------------*/
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
    {
     static char szAppName[] = "Personaldatenbank";
     HWND hwnd;
     MSG msg;
     WNDCLASS wndclass;
    
     wndclass.style         = CS_HREDRAW | CS_VREDRAW;
     wndclass.lpfnWndProc           = WndProc;
     wndclass.cbClsExtra        = 0;
     wndclass.cbWndExtra        = 0;
     wndclass.hInstance     = hInstance;
     wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
     wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
     wndclass.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
     wndclass.lpszMenuName  = NULL; 
     wndclass.lpszClassName = szAppName;
    
     if(!RegisterClass(&wndclass))
     {
         MessageBox(NULL, "RegisterClass failed", szAppName, MB_ICONERROR);
         return 0;
     }
     hwnd = CreateWindowEx(NULL,szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,750,  500,NULL,MainMenu(),hInstance,NULL);
     hInst = hInstance;
    
     ShowWindow(hwnd, iCmdShow);
     UpdateWindow(hwnd);
    
     while(GetMessage(&msg, NULL, 0, 0))
     {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
     return msg.wParam; 
    }
    /*--------------------- WinMain END ----------------------*/
    
    /*--------------------- WndProc --------------------------*/
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
     static HWND hwndButton[NUM];
     static nWidth, nHight;
     static List *pList;
     static bool bListChange = false;
     static iIndex = 0, iNumData = 1;
     int i;                 
     Data *pData = NULL;
    
     switch(msg)
     {
     case WM_COMMAND:
         switch(LOWORD(wParam))
         {
         case ID_EDIT_PERSONALNUMBER:
         case ID_EDIT_NAME:
         case ID_EDIT_SEX:
         case ID_EDIT_LOCATION:
         case ID_EDIT_STREET:   
         case ID_EDIT_HANDY:    
         case ID_EDIT_MONEY:    
         case ID_EDIT_SURNAME:  
         case ID_EDIT_BIRTH:        
         case ID_EDIT_PLZ:          
         case ID_EDIT_EMAIL:
         case ID_EDIT_PHONE:
             if(HIWORD(wParam) == EN_CHANGE)
             {
                 bListChange = true;
                 ++iNumData;
             }
             return 0;
    
         case IDM_FILE_NEW:
         case IDM_FILE_OPEN:
         case IDM_FILE_SAVE:
         case IDM_FILE_SAVEAS:
             MessageBeep(0);
             return 0;
    
         case IDM_APP_EXIT:
             SendMessage(hwnd, WM_CLOSE, 0, 0);
             return 0;
    
         case ID_PUSHB_NEXT:
             if(bListChange)
             {
                 Data_Fill(pData, hwndButton);
                 List_Insert_Data(pList, pData, iIndex);
                 ++iIndex;
                 if(iIndex == iNumData)
                 {
                     List_Insert_Listtyp(pList);
                     ++iNumData;
                 }           
             }
             if(iIndex + 1 < iNumData)
             {
                 Data_Show(pList, hwndButton, iIndex);
                 bListChange = false;
             }
             return 0;
    
         case ID_PUSHB_PREV:
             MessageBeep(0);
             return 0;
         }
         break;
    
     case WM_SIZE:
         nWidth = LOWORD(lParam);
         nHight = HIWORD(lParam);
    
         for(i = 0; i < 6; ++i)
             MoveWindow(hwndButton[i], nWidth / 4 - 150, i * (nHight / 7) + 55, 150, 25, false);
    
         for(i = 6; i < 12; ++i)
             MoveWindow(hwndButton[i], nWidth / 4 * 3 - 150, (i - 6) * (nHight / 7) + 55, 150, 25, false);
    
         for(i = 12; i < 18; ++i)
             MoveWindow(hwndButton[i], nWidth / 4, (i - 12) * (nHight / 7) + 50, 150, 25, false);
    
         for(i = 18; i < 24; ++i)
             MoveWindow(hwndButton[i], nWidth / 4 * 3, (i - 18) * (nHight / 7) + 50, 150, 25, false);
    
         MoveWindow(hwndButton[24], (nWidth / 4) - (150 / 2), nHight / 5 * 4 + 50, 150, 25, false);
         MoveWindow(hwndButton[25], (nWidth / 4 * 3) - (150 / 2), nHight / 5 * 4 + 50, 150, 25, false);
         MoveWindow(hwndButton[26], (nWidth / 4 * 2) - (150 / 2), nHight / 5 * 4 + 50, 150, 25, false);
    
         return 0;
    
     case WM_CREATE:
         List_Create(pList);
         for(i = 0; i < NUM; ++i)
         {
    hwndButton[i] = CreateWindowEx(button[i].dwExStil,button[i].szTyp,button[i].szText,WS_CHILD | WS_VISIBLE | button[i].iStyle,0,0,150,25,hwnd,(HMENU) i, hInst,NULL);
         }
         return 0;
    
     case WM_DESTROY:
         PostQuitMessage(0);
         return 0;
     }
     return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    /*--------------------- WndProc END ----------------------*/
    
    /*--------------------- List_Create ----------------------*/
    int List_Create(List *pList)
    {
     pList = new List;
     if(pList == NULL)
         return 1;
    
     pList->data = NULL;
     pList->next = NULL;
     pList->prev = NULL;
     return 0;
    }
    /*--------------------- List_Create END ------------------*/
    
    /*--------------------- List_Insert_Listtyp --------------*/
    int List_Insert_Listtyp(List *pList)
    {
     List *pNewElement;
    
     if(pList->data == NULL)
         return 0;
    
     pNewElement = new List;
     if(pNewElement == NULL)
         return 1;
     else
     {
         pNewElement->data = NULL;
         pNewElement->prev = pList;
         pList->next = pNewElement;
         return 0;
     }
    }
    /*--------------------- List_Insert_Listtyp END ----------*/
    
    /*--------------------- List_Insert_Data -----------------*/
    int List_Insert_Data(List *pList, Data *pData, int iIndex)
    {
     List *pTemp = pList;
    
     if(pList == NULL)
         return 1;
    
     if(iIndex == 0)
     {
         pList->data = pData;
         return 0;
     }
    
     while((pList->next != NULL) && (iIndex != 0))
     {
         pList = pList->next;
         --iIndex;
     }
     if(iIndex != 0)
     {
         pList = pTemp;
         return 1;
     }
     pList->data = pData;
     pList = pTemp;
     return 0;
    }
    /*--------------------- List_Insert_Data END -------------*/
    
    /*--------------------- List_Delete ----------------------*/
    int List_Delete(List *pList, int iIndex)
    {
     List *pTemp, *pPrev;
    
     if(pList == NULL)
         return 1;
    
     if(iIndex == 0)
     {
         pTemp = pList;
         pList = pList->next;
         pList->prev = NULL;
         delete pTemp;
         return 0;
     }
    
     pTemp = pList;
     while((pList->next != NULL) && (iIndex != 0))
     {
         pPrev = pList;
         pList = pList->next;
         --iIndex;
     }
     if(iIndex != 0)
     {
         pList = pTemp;
         return 1;
     }
     pPrev->next = pList->next;
     pList->prev = pPrev;
     delete pList;
     pList = pTemp;
     return 0;
    }
    /*--------------------- List_Delete END ------------------*/
    
    /*--------------------- Data_Fill ------------------------*/
    [b]
    int Data_Fill(Data *pData, HWND hwndButton[NUM])
    {
     GetWindowText(hwndButton[12], (char*)*pData->PersonalNumber,    14);
     GetWindowText(hwndButton[13], (char*)*pData->Name,              29); 
     GetWindowText(hwndButton[14], (char*)*pData->Sex,                   19);
     GetWindowText(hwndButton[15], (char*)*pData->Location,          29); 
     GetWindowText(hwndButton[16], (char*)*pData->Street,                29);
     GetWindowText(hwndButton[17], (char*)*pData->Handy,             20); 
     GetWindowText(hwndButton[18], (char*)*pData->Money,              9);
     GetWindowText(hwndButton[19], (char*)*pData->Surname,           29);
     GetWindowText(hwndButton[20], (char*)*pData->Birth,             14);
     GetWindowText(hwndButton[21], (char*)*pData->PLZ,                   9);
     GetWindowText(hwndButton[22], (char*)*pData->EMail,             29);
     GetWindowText(hwndButton[23], (char*)*pData->Phone,             14);
    
     return 0;
    }
    /*--------------------- Data_Fill END --------------------*/
    
    /*--------------------- Data_Show ------------------------*/
    int Data_Show(List *pList, HWND hwndButton[NUM], int iIndex)
    {
     List *pTemp = pList;
    
     while((pList->next != NULL) && (iIndex != 0))
     {
         pList = pList->next;
         --iIndex;
     }
     if(iIndex != 0)
     {
         pList = pTemp;
         return 1;
     } 
    
     SetWindowText(hwndButton[12], pList->data->PersonalNumber);
     SetWindowText(hwndButton[13], pList->data->Name); 
     SetWindowText(hwndButton[14], pList->data->Sex);
     SetWindowText(hwndButton[15], pList->data->Location); 
     SetWindowText(hwndButton[16], pList->data->Street);
     SetWindowText(hwndButton[17], pList->data->Handy); 
     SetWindowText(hwndButton[18], pList->data->Money);
     SetWindowText(hwndButton[19], pList->data->Surname);
     SetWindowText(hwndButton[20], pList->data->Birth);
     SetWindowText(hwndButton[21], pList->data->PLZ);
     SetWindowText(hwndButton[22], pList->data->EMail);
     SetWindowText(hwndButton[23], pList->data->Phone);
    
     pList = pTemp;
     return 0;
    }
    /*--------------------- Data_Show END --------------------*/
    
    /*--------------------- MainMenu -------------------------*/
    /*Hier wird nur ein Menü erstellt, da der Code lang ist schreib ich ihn hier nicht*/
    /*--------------------- MainMenu END ---------------------*/
    }
    ////////////////////////////////////////////////////////////
    /*                    Include                            */
    struct
    {
     DWORD dwExStil;
     char * szTyp;
     char * szText;
     int iStyle;
    }
    button[]=
    {
     0,                     "static",   "Personalnummer:",          SS_RIGHT, // Linke Spalte
     0,                     "static",   "Nachname:",                    SS_RIGHT,
     0,                     "static",   "Geschlecht:",                  SS_RIGHT,
     0,                     "static",   "Wohnort:",                     SS_RIGHT,
     0,                     "static",   "Strasse:",                     SS_RIGHT, 
     0,                     "static",   "Rufnummer (Handy):",       SS_RIGHT,
     0,                     "static",   "Bruttogehalt:",                SS_RIGHT, // Rechte Spalte
     0,                     "static",   "Vorname:",                     SS_RIGHT,
     0,                     "static",   "Geburtsdatum:",                SS_RIGHT,
     0,                     "static",   "PLZ:",                         SS_RIGHT,
     0,                     "static",   "E-Mailadresse:",               SS_RIGHT,
     0,                     "static",   "Rufnummer (Festnetz):",    SS_RIGHT,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL, 
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,         
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     WS_EX_CLIENTEDGE,  "edit",     NULL,                               WS_BORDER | ES_AUTOHSCROLL,
     0,                     "button",   "Vorheriger Datensatz",     BS_PUSHBUTTON,
     0,                     "button",   "Nächster Datensatz",       BS_PUSHBUTTON,
     0,                     "button",   "Datensatz löschen",            BS_PUSHBUTTON,
    };
    
    typedef struct list_type
    {
     struct data_type *data;
     struct list_type *next;
     struct list_type *prev;
    }List, *List_PTR;
    
    typedef struct data_type
    {
     char PersonalNumber[15];
     char Name[30];
     char Sex[20];
     char Location[30];
     char Street[30];
     char Handy[21];
     char Money[10];
     char Surname[30];
     char Birth[15];
     char PLZ[10];
     char EMail[30];            
     char Phone[15];
    }Data, *Data_PTR;
    /*--------------------- Strukturen END -------------------*/
    
    /*--------------------- Definitionen ---------------------*/
    #define ID_STATIC                                    0
    #define ID_EDIT_PERSONALNUMBER                          12
    #define ID_EDIT_NAME                        13
    #define ID_EDIT_SEX                     14
    #define ID_EDIT_LOCATION                    15
    #define ID_EDIT_STREET                      16
    #define ID_EDIT_HANDY                       17
    #define ID_EDIT_MONEY                       18
    #define ID_EDIT_SURNAME                     19
    #define ID_EDIT_BIRTH                       20
    #define ID_EDIT_PLZ                     21
    #define ID_EDIT_EMAIL                       22
    #define ID_EDIT_PHONE                       23
    
    #define ID_PUSHB_PREV                       24
    #define ID_PUSHB_NEXT                       25
    #define ID_PUSHB_DEL                        26
    
    #define NUM (sizeof button / sizeof button[0])
    
    #define IDM_FILE_NEW                        40001
    #define IDM_FILE_OPEN                       40002
    #define IDM_FILE_SAVE                       40003
    #define IDM_FILE_SAVEAS                     40004
    #define IDM_APP_EXIT                        40005
    #define IDM_SORT_ID_DOWN                    40006      
    #define IDM_SORT_ID_UP                      40007
    #define IDM_SORT_NAME_DOWN                  40008
    #define IDM_SORT_NAME_UP                    40009
    #define IDM_SORT_SURNAME_DOWN                       40010
    #define IDM_SORT_SURNAME_UP                     40011
    #define IDM_SORT_SEX_DOWN                   40012
    #define IDM_SORT_SEX_UP                     40013
    #define IDM_SORT_LOC_DOWN                   40014
    #define IDM_SORT_LOC_UP                     40015
    #define IDM_SORT_PLZ_DOWN                   40016
    #define IDM_SORT_PLZ_UP                     40017
    #define IDM_SORT_STREET_DOWN                        40018
    #define IDM_SORT_STREET_UP                  40019
    #define IDM_SORT_BIRTH_DOWN                     40020
    #define IDM_SORT_BIRTH_UP                   40021
    #define IDM_SORT_MONEY_DOWN                     40022
    #define IDM_SORT_MONEY_UP                   40023
    #define IDM_SORT_EMAIL_DOWN                     40024
    #define IDM_SORT_EMAIL_UP                   40025
    #define IDM_SORT_PHONE_DOWN                     40026
    #define IDM_SORT_PHONE_UP                   40027
    /*--------------------- Definitionen END -----------------*/
    
    /*--------------------- Globale Variablen ----------------*/
    HINSTANCE hInst;
    /*--------------------- Globale Variablen END ------------*/
    

    Ist doch ein bischen viel Code 🙄 Sorry
    (@ mods wenn zuviel Code könnt ihr unwichtige sachen rauskürzen)
    Bin auch für Verbesserungsvorschläge dankbar !

    [ Dieser Beitrag wurde am 06.11.2002 um 18:27 Uhr von C Newbie editiert. ]



  • Warum derefenzierst Du die Member von pData?



  • Meinst du das (char*)*pData->... ? Habe gedacht das dass so funktionieren könnte.
    Voher hatte ich das ohne cast und * "Wie heißt das Ding blos?" (pData->...) ging aber auch nicht.

    [ Dieser Beitrag wurde am 06.11.2002 um 18:31 Uhr von C Newbie editiert. ]



  • Außerdem ist der Data*, den Du im Aufruf von Data_Fill angibst, NULL.



  • Original erstellt von MFK:
    Außerdem ist der Data, den Du im Aufruf von Data_Fill angibst, NULL.*

    Heißt das, dass ich erst

    pData = new Data;
    

    schreiben muss?



  • Das wäre eine Möglichkeit. Was Du schreiben musst hängt davon ab, was das Programm machen soll. Fakt ist nur, dass Du Probleme bekommst, weil Du den Pfeiloperator mit einem Nullzeiger verwendest.



  • Original erstellt von C Newbie:
    **Heißt das, dass ich erst

    pData = new Data;
    

    schreiben muss?**

    auch wenn das eigentlich nicht WinAPI ist und jetzt gleich wieder einer schreit:

    so isses. Du hast sonst keinen Speicher für deine eigentlichen Daten.

    mach doch aus deiner struct list_type eine Klasse und lass im Konstruktor dann für die angehängte struct data_type gleich den Speicher reservieren. Im Destruktor kannst du ihn dann auch wieder freigeben. Hätte den Vorteil, dass du dich später bei new list_type nicht mehr um data_type kümmern brauchst.



  • int List_Create(List *pList)
    {
     pList = new List;
     if(pList == NULL)
         return 1;
    
     pList->data = NULL;
     pList->next = NULL;
     pList->prev = NULL;
     return 0;
    }
    

    So funzt das net, da pList-Parameter ne Kopie is!

    int List_Create(List& *pList)
    {
     pList = new List;
     if(pList == NULL)
         return 1;
    
     pList->data = NULL;
     pList->next = NULL;
     pList->prev = NULL;
     return 0;
    }
    

    [ Dieser Beitrag wurde am 07.11.2002 um 08:34 Uhr von RenéG editiert. ]



  • Das mit dem Schreiben in die Data structur habe ich hinbekommen, habe einfach
    keinen Zeiger im WinProc sondern eine "echte" Data structur erstellt und dann
    ihre Adresse übergeben.

    So funzt das net, da pList-Parameter ne Kopie is!

    Ups.
    Vieleicht ist das dann auch der Grund warum ich pList->data nicht pData zuweisen kann:

    int List_Insert_Data(List *pList, Data *pData, int iIndex)
    {
    List *pTemp = pList;

    if(iIndex == 0)
    {
    pList->data = pData; //<= Hier stürzt das Programm ab
    return 0;
    }
    ...

    Das mit der Kopie muss ich ändern und poste dann mal ob es dann funzt.


Anmelden zum Antworten