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 erstpData = 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.