С Новым годом! Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 47
1

Неизвестная ошибка с WinAPI

01.12.2014, 06:58. Показов 537. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья, есть код функции обработки диалогового окна, которая при нажатии на кнопку (case 6) считывает данные с поля EDIT (№5) и проверяет содержимое на правильность ввода. Проблема в том, что иногда, но не всегда, после нажатия на кнопку и 10 секунд ожидания выбивается неизвестная ошибка и программа закрывается. Самое обидное ,что такой же код в аналогичной функции работает без сбоев. Если вам известно решение, помогите пожалуйста. Вот сама функция:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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;
}
А вот её вызов(выделено жирным)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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;
}
Вот глобальные переменные
C
1
2
3
4
5
6
7
8
9
10
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;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2014, 06:58
Ответы с готовыми решениями:

неизвестная ошибка
нужна помощь, Задание: нужна сортировка массива все отрицательные элементы массива перенести в его...

Неизвестная ошибка , в интернете ничего подобного не нашел
Есть код на языке Си #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;graphics.h&gt; #include...

Ошибка 101 (net::ERR_CONNECTION_RESET): Неизвестная ошибка
Установил сегодня 7ку , все вроде нормально , поствил гугл хром и мемогу зайти на сайт gmail на...

При попытке добавить программно запись в зашифрованную паролем БД MS Access с помощью метода Insert выскакивает ошибка - Неизвестная ошибка
При попытке добавить программно запись в зашифрованную паролем БД MS Access с помощью метода Insert...

4
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
01.12.2014, 08:41 2
Цитата Сообщение от kalter14i77 Посмотреть сообщение
C
1
mass = NULL;
По умолчанию если нет явной декларации типа, то тип считается int. Это может являться источником Вашей ошибки. Так же надо проверять возврат всех вызываемых функций и ввести систему сообщений (или логгировнаия) о нестандартном поведении. Так же перед копированием памяти надо сначала заполнить область нулями и предусмотреть чтобы в любом случае последним симолом был нуль.
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,883
01.12.2014, 09:37 3
Цитата Сообщение от castorsky Посмотреть сообщение
По умолчанию если нет явной декларации типа, то тип считается int.
В языке С никогда не было возможности взять и посреди кода употребить необъявленное имя в качестве переменной. Если имя 'mass' компилятору неизвестно, то код 'mass = NULL' всегда был ошибочным, а не "тип считается int".

Но к данному случаю это все никакого отношения не имеет. В первом сообщении ТС видно, что переменная 'mass' явно объявлена как глобальная.

Добавлено через 16 минут
Цитата Сообщение от kalter14i77 Посмотреть сообщение
C
1
2
3
4
n++;
mass = realloc(mass, n * sizeof(profiles));
strcpy((mass + n)->name, buf.name);
(mass + n)->kolmoney = buf.kolmoney;
Тут очевидная белиберда написана. При помощи 'realloc' размер массива был увеличен до 'n'. Это означает, что доступаться разрешается к элементам от 'mass[0]' до 'mass[n-1]'. Вы же смело пихаете данные в 'mass[n]'. В результате - разрушение памяти и неопределенное поведение.
1
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
01.12.2014, 14:18 4
TheCalligrapher, да, я перепутал со случаем входных параметров без явного указания типа.
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 47
01.12.2014, 17:35  [ТС] 5
castorsky, спасибо огромное, всего тебе самого наилучшего! Господи, я не мог понять в чём дело, вот готовый рабочий код, может кто с похожей ошибкой столкнётся.
C
1
2
3
4
n++;
mass = realloc(mass, n * sizeof(profiles));
strcpy((mass + n - 1)->name, buf.name);
mass + n - 1)->kolmoney = buf.kolmoney;
0
01.12.2014, 17:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2014, 17:35
Помогаю со студенческими работами здесь

Неизвестная ошибка
Добрый день! Помогите, пожалуйста! Выдает вот такую ошибку. Подскажите, как исправить. Нажимаю...

Неизвестная ошибка.
Добрый вечер!! В создании сайтов я новичок, делаю все по видео уроку....

Неизвестная ошибка
Помогите найти ошибку ЗАдание ДАно натуральное число n. Посчитать, сколько неотрицательных...

Неизвестная ошибка
Привет! Мне удалось написать 3 простейших программы для кодирования и декодирования текста, и я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru