![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
tonchitos |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
у меня есть класс
в классе рекурсивная ф-ия
в ней вызывается ф-ия базового класса
создаю объект класса myMetaVisitor GetFeatures; создаю объект класса, наследованном от mdl::CmdlPetalEntity CmdlPetalFile pResult; вызываю ф-ию.... GetFeatures.myGetFeature(myDoc->petalFile,&pResult, strId) ; суть такая... в ф-ию передается строка с идентификатором выбранного элемента (в дереве) передается указатель на объект класса с деревом... передается указатель pResult... ф-ия ищет совпадение выбранного идентификатора с идентификатором в дереве...если нахгодит - то присваивает указатель на эту фигню. резалту... присваивает успешно...но потом...в каком то месте при выходе из очередного уровня рекурсии указатель портится.... отладкой так и не получилось выяснить что не так... ((( -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
||||||
|
|||||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
и ты решила, что будет лучше, если мы вместо тебя прогоним в дебаге? )
если под словом "портится" имеется в виду "меняется" и у тебя мелкософтская студия, то рекомендую воспользоваться Debug->New Breakpoint-> New data breakpoint... фича активна только во время дебага узнаешь адрес нужного указателя (то есть &result, или что тебе нужно), нажимаешь F5, и каждый при остановке раз проверяешь, нормальные ли данные. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
фигасе рекурсия...
![]() вызывается сначала ф-я myGetFeature класса наследника, потом из нее myGetFeature базового класса, потом в ней myGetMetaFeature базового, которая в свою очередь вызывает myGetFeature наследника... мой мозх... ![]() проще нужно делать, рекурсия в которой участвуют 3 ф-ии 2 из которых это реализации одной и той же виртуальной ф-ии ... хрен там что найдешь отладчиком, там такая логика запутанная... |
|||
|
||||
tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
а я так и сделала...
он портится при выходе из какого-то уровня рекурсии (((( Добавлено @ 15:36 Lazin, попробую...но боюсь напортачить уже ))) )))) Добавлено @ 15:37 хотя...точно такая же рекурсия с обходом дерева и постройкой его работает замичательна Это сообщение отредактировал(а) tonchitos - 22.4.2008, 15:44 -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
tonchitos |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
млиин.. во время отладки обратила внимание что и адрес резалта меняется..но значение сохраняется............
аааааАААААААААААААААААААААААААААААААААААА ОСЕНИЛО! Добавлено через 3 минуты и 14 секунд кароч...я ж туда ссылочкой передаю...а в рекурсии не ссылочкой...вот адресок то и меняется.. Добавлено через 9 минут и 32 секунды мля... ток хуже стало... Добавлено через 14 минут и 31 секунду
мой вызов... дальше в ф-ии вызываю так base::myGetFeature(pEntity, (mdl::CmdlPetalEntity *)&result, tstrId); дальсче
теперь указатель меняется постоянно...[censored 6] -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
||||||
|
|||||||
tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
люююдииииииииииииииииииииииииииииииии
![]() Добавлено через 3 минуты и 59 секунд че не так.... передаю ссылку на указатель GetFeatures.myGetFeature(myDoc->petalFile,(mdl::CmdlPetalEntity * )&pResult, strId) ; вот туда void myMetaVisitor::myGetFeature(const mdl::CmdlPetalEntity *pEntity, mdl::CmdlPetalEntity * result, tstring tstrId) тут передаю опять ссылку на ентот указатель... base::myGetFeature(pEntity, (mdl::CmdlPetalEntity *)&result, tstrId); сюда virtual void myGetFeature(T* pObj, mdl::CmdlPetalEntity *result, tstring tstrId) тут передаю... base::myGetMetaFeature(cFeatures[i],pObj,(mdl::CmdlPetalEntity*)&result,tstrId); сюда virtual void myGetMetaFeature(const CmdlMetaFeature* pMetaFeature, T* pObj, mdl::CmdlPetalEntity *result, tstring tstrId) а тут обрано в ту ф-ию myGetFeature(TmdlCast<T>(pMetaFeature->m_pfnGetElement(const_cast<tUnconst<T*>::tType>(pObj),pos)), (mdl::CmdlPetalEntity*)&result, tstrId); -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
щедрой рукой рассыпаешь по коду пачку assert'ов, IsBad*Ptr'ов и тестируешь.
|
|||
|
||||
tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
зачем ассерты, если при передаче параметра в ф-ию я ссылку передаю, а при входе в ф-ию там уже оказывается параметр с другим адресом...как так ваще..
Добавлено через 3 минуты и 49 секунд тут должен быть какой-то грубый ляп..другого не дано... CmdlPetalFile *pResult(0) вот объект вот передаю ссылку на ентот объект.... GetFeatures.myGetFeature(myDoc->petalFile,(mdl::CmdlPetalEntity * )&pResult, strId) ; а нифига не передается....создается объект с другим адреском.... -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
Rififi |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
||||
|
||||
tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
и как мне быть???
-------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Судя по названию, это указатель. Ты берешь указатель на указатель и приводишь его к типу mdl::CmdlPetalEntity *. Попробуй эту строчку заменить на:
|
||||
|
|||||
tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
кароче - вот как надо было...
mdl::CmdlPetalEntity * pResult(0); GetFeatures.myGetFeature(myDoc->petalFile,pResult, strId) ; безо всякого приведения типов и лишних ссылок.... а тут так void myMetaVisitor::myGetFeature(const mdl::CmdlPetalEntity *pEntity, mdl::CmdlPetalEntity* & result, tstring tstrId) и в ф-иях базового класса соответствующе все -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
И вообще. у тебя есть очень серьезная ошибка в проектировании, раз ты применяешь const_cast
|
|||
|
||||
tonchitos |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 447 Регистрация: 24.2.2007 Репутация: нет Всего: 40 |
не...никаких конст кастов лишних нет...
кост каст есть тока при проверке, что у мя - класс, атрибут, референс и тп.... так например: CmdlClass * pClass = TmdlCast<CmdlClass>(const_cast<CmdlPetalEntity*>(pEntity)); if (pClass) ............ -------------------- – Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
tonchitos, вот он и лишний. Почитай умные книжки.
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |