Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Локальная переменная меняет свое значение "сама по себе" / 6 сообщений из 6, страница 1 из 1
12.08.2008, 10:45
    #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
12.08.2008, 11:30
    #35482580
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Локальная переменная меняет свое значение "сама по себе"
Код: plaintext
delta =  17  + len +  4 *I;

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

?
В первой итерации цикла len = I = 0 и
delta = 17
...
Рейтинг: 0 / 0
12.08.2008, 12:26
    #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
12.08.2008, 12:45
    #35482834
zloy den
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Локальная переменная меняет свое значение "сама по себе"
Железно где-то выход за пределы массива. У меня как-то такое было когда читал из файла блоками(размер блока по умолчанию был больше нужного мне)
...
Рейтинг: 0 / 0
21.08.2008, 12:12
    #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]