powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Локальная переменная меняет свое значение "сама по себе"
6 сообщений из 6, страница 1 из 1
Локальная переменная меняет свое значение "сама по себе"
    #35482491
DanilSoldatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Пишу прогу на Си и иногда встречаюсь с такой ситуацией, что
локальная переменная меняет свое значение "сама по себе". Ну т.е. явно я ей ничего не присваиваю, а значение "чудесным образом" меняется:). Я так понимаю, что в эту область памяти записывается какое-то другое значение, но почему? Есть ли какой-нить более-менее универсальный способ следить и отлавливать такие ошибки? Заранее спасибо.

Вот фрагмент Си-шного кода, где переменная delta неожиданно меняет свое значение:
Код: plaintext
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.
52.
53.
54.
    
            int len=  0 , I =  0 , delta =  0 ;
   
            while (len < length -  11  -  4 *I)
            {
                        delta =  17  + len +  4 *I;
                        vCodeman.ServiceType_id = WordFromArray(vResultBuf, delta -  2 );
                        vCodeman.Datalen = StrFromArray(vResultBuf, delta, vCodeman.ManualData);
       
                        //вот тут значение delta одно
                                DateTimeFromArray(vResultBuf, delta + vCodeman.Datalen +  2 , &vCodeman.UpdateDate);
                            //а тут уже другое значение delta  
 
                        CodemanToFlash( &vCodeman );
                        memset( &vCodeman,  0 , sizeof(struct CodemanData));
                        len += WordFromArray(vResultBuf, delta -  4 );
                        I++;    
            }
 
 
Код ф-ции DateTimeFromArray следующий(эта ф-ция берет из байтовой послед-ти  12  байтов - дату и время, хотя это неважно:)):
 
void DateTimeFromArray(const char *aData, const int aFromPos, DateTime *vDateTime)
{
      char arr[ 1 ], year[ 3 ];
   
      memset(arr,  0 ,  2 );
      memset(year,  0 ,  4 );
   
      year[ 0 ]= 50 ;  
      year[ 1 ]= 48 ;    
      year[ 2 ]=aData[aFromPos];  
      year[ 3 ]=aData[aFromPos +  1 ];  
      vDateTime->dt.TM_YEAR   = atoi(year);
   
      arr[ 0 ]=aData[aFromPos +  2 ];
      arr[ 1 ]=aData[aFromPos +  3 ];  
      vDateTime->dt.TM_MONTH  = atoi(arr);
   
      arr[ 0 ]=aData[aFromPos +  4 ];
      arr[ 1 ]=aData[aFromPos +  5 ];    
      vDateTime->dt.TM_DAY    = atoi(arr);
   
      arr[ 0 ]=aData[aFromPos +  6 ];
      arr[ 1 ]=aData[aFromPos +  7 ];  
      vDateTime->tt.TM_HOUR   = atoi(arr);
   
      arr[ 0 ]=aData[aFromPos +  8 ];
      arr[ 1 ]=aData[aFromPos +  9 ];  
      vDateTime->tt.TM_MINUTE = atoi(arr);
   
      arr[ 0 ]=aData[aFromPos +  10 ];
      arr[ 1 ]=aData[aFromPos +  11 ];  
      vDateTime->tt.TM_SECOND = atoi(arr);
}
...
Рейтинг: 0 / 0
Локальная переменная меняет свое значение "сама по себе"
    #35482580
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
delta =  17  + len +  4 *I;

?
...
Рейтинг: 0 / 0
Локальная переменная меняет свое значение "сама по себе"
    #35482627
DanilSoldatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Код: plaintext
delta =  17  + len +  4 *I;

?
В первой итерации цикла len = I = 0 и
delta = 17
...
Рейтинг: 0 / 0
Локальная переменная меняет свое значение "сама по себе"
    #35482774
avb1003
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DanilSoldatov
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
...
void DateTimeFromArray(const char *aData, const int aFromPos, DateTime *vDateTime)
{
      char arr[ 1 ], year[ 3 ];
   
      memset(arr,  0 ,  2 );
      memset(year,  0 ,  4 );
   
      year[ 0 ]= 50 ;  
      year[ 1 ]= 48 ;    
      year[ 2 ]=aData[aFromPos];  
      year[ 3 ]=aData[aFromPos +  1 ];  
      vDateTime->dt.TM_YEAR   = atoi(year);
   
      arr[ 0 ]=aData[aFromPos +  2 ];
      arr[ 1 ]=aData[aFromPos +  3 ];  
e->tt.TM_SECOND = atoi(arr);
...
}

Масcивы "короткие".
Надо:
Код: plaintext
1.
  char arr[ 2 ], year[ 4 ];
...
Рейтинг: 0 / 0
Локальная переменная меняет свое значение "сама по себе"
    #35482834
zloy den
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Железно где-то выход за пределы массива. У меня как-то такое было когда читал из файла блоками(размер блока по умолчанию был больше нужного мне)
...
Рейтинг: 0 / 0
Локальная переменная меняет свое значение "сама по себе"
    #35498771
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avb100Масcивы "короткие".
Надо:
Код: plaintext
1.
  char arr[ 2 ], year[ 4 ];

Он наверное с визуал бейсика пришёл, там как раз если указываешь размер массива 3, будет 4 элемента, а 3 значит конечный номер. То есть доступны индексы 0, 1, 2 и 3 Я сам в шоке был, с этого бейсика.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Локальная переменная меняет свое значение "сама по себе"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]