Неизвестная ошибка с 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;

Объяснение кода листинга программы

  1. Увеличивается значение переменной n на единицу.
  2. С помощью функции realloc увеличивается размер блока памяти, выделенного под массив mass. Новый размер блока памяти равен n умноженному на размер памяти, занимаемой одним элементом массива profiles.
  3. В новый элемент массива mass копируется значение переменной buf.name.
  4. В новый элемент массива mass копируется значение переменной buf.kolmoney.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5