![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Serjio |
|
||||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 26.4.2007 Репутация: нет Всего: нет |
Впервые столкнулся с очень странной ошибкой: при попытке чтения значения поля структуры, считывается значение из памяти соседней по отношению к нужному полю. Код примерно такой (сильно упрощенный вариант, потому что код не могу цитировать):
есть такая функция:
При выполнении функции func (после корректной инициализации - в pi записан адрес выделенной памяти, и аргумент функции тоже правильный) значение переменной р становится равным значению, хранящемуся в памяти, следующей сразу после поля pi, т.е. например если поля pi хранится по адресу addr, то в переменную p записывается значение int из памяти addr+4. Причем наблюдаемая ошибка происходит далеко не во всех функциях наподобие func, т.е. к некоторых все считывается верно. В отладчике значения переменных p и pi разные (сразу после выполнения указанной строки функции func), причем значение pS2->m_S1.pi - верное, а р - нет, т.е. получается что сразу после выполнения присваивания значения переменных разные! Все это происходит в солюшене под VS7.1, в солюшене 6 проектов, причем структуры S1 и S2 описаны в разных проектах, вызов функции func производится из третьего проекта (не знаю важно это или нет). Не проверял точно ли это, но заметил, что в функциях из проекта, где описана S2, считавание происходит верно, в других - неверно, но повторюсь, конкретно во всех функциях солюшена не проверял, так что это не точно... Есть подозрение что проблема связана с настройками проектов (конфигурации), но сколько я не менял настройки, ничего не помогало... Забыл сказать, все это реализовано с чистом С (все проекты один сплошной С). Заранее спасибо! Это сообщение отредактировал(а) Serjio - 26.4.2007, 22:06 |
||||
|
|||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
во-первых, есть подозрение, что сами структуры определены не в одном хэдере, а в самом коде, что при несинхронизованном изменении определений будет давать именно такой эффект... либо не в коде, а в просто в нескольких местах (хедерах)...
во-вторых... попробуй повторить эту проблему в виде одного-двух модулей... можешь взять реальные модули в которых проявляется проблема и оставить в них только то, что необходимо для проявления проблемы(если твой код такой секретный, то можешь изменить все имена)... выложи их сюда - там посмотрим... ставлю 90%, что проблема решится в процессе составления псевдокода проявляющего проблему... ![]() -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
проверь чтобы у всех проектов было в настройках одинаковое значение в CodeGeneration->Runtime Library и CodeGeneration->Struct Member Alignment
|
|||
|
||||
Serjio |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 26.4.2007 Репутация: нет Всего: нет |
структуры S1 и S2 действительно описаны в разных хедерах, более того в разных проектах, но разве это криминал?
Да, это я уже сделал много раз ![]() |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
вот что есть криминал:
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Serjio |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 26.4.2007 Репутация: нет Всего: нет |
Решил проблему! Дело было вот в чем: структура данных была такая:
Соответственно получалось, что в некоторых проектах __DEBUG__ была определена, а в некоторых - нет, поэтому и смещения поля pi в структуре S1 были разные в разных проектах. Всем спасибо! Ваши советы помогли! |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Да, полностью согласен с Daevaorn, такого еще не видал... |
|||
|
||||
Serjio |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 26.4.2007 Репутация: нет Всего: нет |
||||
|
||||
JackYF |
|
||||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Это - в кодaх функций, ни в коем случае не в описании структур, классов и т.д. Поля структуры данных должны быть определены однозначно. А вот в коде ты можешь эти заглушки ставить столько, сколько тебе нужно. |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Serjio |
|
|||
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 26.4.2007 Репутация: нет Всего: нет |
Логично, спасибо! Но минус данного способа в том, что тогда не получится автоматом "чистить" код. Суть в том что иногда надо быстро весь код окруженный #ifdef _DEBUG удалить, и я для этого юзал спец-ый скрипт. А в предложенном методе прийдется структуры чистить вручную...
Дык, если бы я про него помнил, то и вопроса не было... тут дело в том, что все, что я тут написал, далеко не на виду в исходном коде, в том коде что у меня это все увидеть стоило больших трудов...собственно именно поэтому сразу не понимал в чем дело... |
|||
|
||||
Ken |
|
|||
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 31.3.2007 Репутация: 2 Всего: 4 |
Нет проблем в том что и в .h файлах тоже условные компиляции которые могут менять длину структур в зависимости от переменных препроцессора. Это тоже не криминал. Просто надо перекомпилить все модули которые используют эти структуры при их изменениях. Если все это в составе одного проекта то корректно составленный мейк-файл делает все.
|
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
А немного некорректно составленный мэйк-файл может настолько испортить всю эту малину. У меня еще раз вопрос - зачем? а если не одного? У меня некоторые структуры моих данных используются в десятках проектов... Так... теперь дальше...
Нескромный вопрос - зачем? Для релизного кода достаточно не определять _DEBUG, это понятно... Но если уже так надо, то... Неужели сложно этот скрипт переделать или написать свой? Добавлено через 2 минуты и 27 секунд имхо, это плохой стиль и чреватый потенциальными граблями. я всегда обходился без этого... у меня даже в голову не приходило делать подобные штуки, если честно. Вот, кстати, человек, открывший тему, уже на эти грабли напоролся. Тут недавно было вспомнено, что на лежащие грабли рано или поздно кто-нибудь наступит. |
|||
|
||||
Ken |
|
|||
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 31.3.2007 Репутация: 2 Всего: 4 |
Когда вы пишете кросс-платформенный код, часто приходится использовать разные типы полей в зависимости от системы. Например, HANDLE в Windows и int в *nix. По соображениям KISS не хочется их абстргировать внутри структуры PrivateData и использовать указатель к этим данным. Кроме того хотите вы это или нет, в активно разрабатываемом проекте все равно часто приходится менять .h файлы вне зависимости от того как вы их составляете и вы ОБЯЗАНЫ пересобрать все модули (как только добавляете, удаляете поля или меняете их тип). Так что ваш хороший стиль все равно не избавляет от корректных мейк-файлов или от корректных компиляций.
Это сообщение отредактировал(а) Ken - 28.4.2007, 17:27 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |