![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| DanilSoldatov |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 30.4.2008 Репутация: нет Всего: нет |
Здравствуйте!
Пишу прогу на Си и иногда встречаюсь с такой ситуацией, что локальная переменная меняет свое значение "сама по себе". Ну т.е. явно я ей ничего не присваиваю, а значение "чудесным образом" меняется Вот фрагмент Си-шного кода, где переменная delta неожиданно меняет свое значение:
Код ф-ции DateTimeFromArray следующий(эта ф-ция берет из байтовой послед-ти 12 байтов - дату и время, хотя это неважно
|
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Ужасный код. Куча магических чисел и разный стиль именования идентификаторов.
А то что переменная вдруг меняет своё значения - виноват автор кода. Он явно так сильно "химичит" с памятью, что просто выходит за границы массива где-то и портит стек. |
|||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
DanilSoldatov,
пустой код, потому что о типах ни слова и их размеров и много магических чисел. Вообще у меня была такая байда из-за компилятора старого и буста, но это С++. У тебя же судя по всему при работе с массивом проблемы. Если ты точно локализовал функцию, в которой значение меняется, сделай трассировку, чтобы определить строку, в которой происходит изменение. Для начала советую присмотрется к aData и размеру этой строки. Это сообщение отредактировал(а) Torsten - 12.8.2008, 09:35 --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
| DanilSoldatov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 30.4.2008 Репутация: нет Всего: нет |
Что касается типов:
struct CodemanData vCodeman; char vResultBuf[CODEMAN_MAX_SIZE] = {0};
Я так понимаю, что в ф-ции DateTimeFromArray что-то не так т.к. после нее переменная delta меняет свое значение (хотя в DateTimeFromArray она как константа) Что не так? |
|||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
Даже более, она передается по значению и копируется. Это не ссылка и не указатель. а вот это уже тебе нужно узнать что не так Я лишь выдвинул предположение. Не факт, что это строка имеет длину > 11. --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
|
|||
|
||||
| DanilSoldatov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 30.4.2008 Репутация: нет Всего: нет |
||||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
vResultBuf это получается char*. А память под массив на который он указывает, нигде не выделяется
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| Supersedes |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
В 5-й строке она тоже сама себя прописала!? Это сообщение отредактировал(а) Supersedes - 13.8.2008, 08:19 |
||||
|
|||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Supersedes, ты комментарии-то в коде читал?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| MastEdm |
|
|||
![]() Master ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 3.12.2005 Где: Москва, МГИУ Репутация: 1 Всего: 2 |
Лучше, конечно, код переписать. А если лениво, то в дебагере делай breakpoint на 8 строчку, а потом watch на память, выделенную под delta. Как только её кто-то поменяет, дебагер тебе об этом сообщит.
|
|||
|
||||
| Supersedes |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 29.7.2008 Репутация: нет Всего: нет |
ksili, нет. Щаз прочитаю..
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |