Неизвестная ошибка с WinAPI - C (СИ)
Формулировка задачи:
Друзья, есть код функции обработки диалогового окна, которая при нажатии на кнопку (case 6) считывает данные с поля EDIT (№5) и проверяет содержимое на правильность ввода. Проблема в том, что иногда, но не всегда, после нажатия на кнопку и 10 секунд ожидания выбивается неизвестная ошибка и программа закрывается. Самое обидное ,что такой же код в аналогичной функции работает без сбоев. Если вам известно решение, помогите пожалуйста. Вот сама функция:
А вот её вызов(выделено жирным)
Вот глобальные переменные
BOOL CALLBACK DlgProc3(HWND hw, UINT msg, WPARAM wp, LPARAM lp) { mass = NULL; char str[15]; BOOL flag = TRUE; int n = 0; switch (msg) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch(LOWORD(wp)) { case 6: { if((fo = fopen("profiles.bin", "rb")) == 0) { MessageBox(hw, "Ошибка открытия файла с профилями!!!", "Ошибка", MB_OK|MB_ICONINFORMATION); exit(0); } while(!feof(fo)) { profiles buf; if(fread(&buf, sizeof(profiles), 1, fo)) { n++; mass = realloc(mass, n * sizeof(profiles)); strcpy((mass + n)->name, buf.name); (mass + n)->kolmoney = buf.kolmoney; } } fclose(fo); GetDlgItemText(hw, 5, str, 15); for(int i = 0; i < n; i++) if(strcmp(str, (mass + i)->name) == 0) flag = FALSE; if((strlen(str) == 0) || (strlen(str) > 10) || (flag == FALSE)) { MessageBox(hw,"Неверный формат ввода имени! Имя должно содержать от 1 до 10 символов","Ошибка",MB_OK|MB_ICONINFORMATION); return TRUE; } /*for(int i = 0; i < n; i++)*/ EndDialog(hw, 0); break; } case 7: {EndDialog(hw, 0); break;} } } return FALSE; }
BOOL CALLBACK DlgProc2(HWND hw, UINT msg, WPARAM wp, LPARAM lp) { int i = 0, pos; mass = NULL; switch (msg) { case WM_INITDIALOG: if((fo = fopen("profiles.bin", "rb")) == 0) { MessageBox(hw, "Ошибка открытия файла с профилями!!!", "Ошибка", MB_OK|MB_ICONINFORMATION); exit(0); } fseek(fo, 0, SEEK_END); pos = ftell(fo); if(pos == 0) { fclose(fo); DialogBox(hInstan, "DLG_INFO", hw, DlgProc4); return FALSE; } fseek(fo, 0, SEEK_SET); while(!feof(fo)) { profiles buf; if(fread(&buf, sizeof(profiles), 1, fo)) { SendDlgItemMessage(hw, 5, LB_ADDSTRING, 0, (LPARAM)buf.name); i++; mass = realloc(mass, i * sizeof(profiles)); strcpy((mass + i)->name, buf.name); (mass + i)->kolmoney = buf.kolmoney; } } fclose(fo); return TRUE; case WM_COMMAND: switch(LOWORD(wp)) { case 6: { SendDlgItemMessage(hw, 5, LB_GETTEXT, (WPARAM)SendDlgItemMessage(hw, 5, LB_GETCURSEL, (WPARAM) 0, (LPARAM) 0), (LPARAM) textbuf); [B]DialogBox(hInstan, "DLG_EDIT1", hw, DlgProc3); [/B] break; } case 7: {EndDialog(hw, 0); break;} case 8: {EndDialog(hw, 0); break;} } } return FALSE; }
typedef struct {char name[20]; int kolmoney;} profiles; typedef struct {int numb; int color; int c_n;} ruletka; HINSTANCE hInstan; FILE *fo; profiles *mass = NULL; char textbuf[15] = {0}; int n;
Решение задачи: «Неизвестная ошибка с WinAPI»
textual
Листинг программы
n++; mass = realloc(mass, n * sizeof(profiles)); strcpy((mass + n - 1)->name, buf.name); mass + n - 1)->kolmoney = buf.kolmoney;
Объяснение кода листинга программы
- Увеличивается значение переменной
n
на единицу. - С помощью функции
realloc
увеличивается размер блока памяти, выделенного под массивmass
. Новый размер блока памяти равенn
умноженному на размер памяти, занимаемой одним элементом массиваprofiles
. - В новый элемент массива
mass
копируется значение переменнойbuf.name
. - В новый элемент массива
mass
копируется значение переменнойbuf.kolmoney
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д