Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > не пойму где портится указатель ((( |
Автор: tonchitos 22.4.2008, 15:14 | ||||||
у меня есть класс
в классе рекурсивная ф-ия
в ней вызывается ф-ия базового класса
создаю объект класса myMetaVisitor GetFeatures; создаю объект класса, наследованном от mdl::CmdlPetalEntity CmdlPetalFile pResult; вызываю ф-ию.... GetFeatures.myGetFeature(myDoc->petalFile,&pResult, strId) ; суть такая... в ф-ию передается строка с идентификатором выбранного элемента (в дереве) передается указатель на объект класса с деревом... передается указатель pResult... ф-ия ищет совпадение выбранного идентификатора с идентификатором в дереве...если нахгодит - то присваивает указатель на эту фигню. резалту... присваивает успешно...но потом...в каком то месте при выходе из очередного уровня рекурсии указатель портится.... отладкой так и не получилось выяснить что не так... ((( |
Автор: Alek86 22.4.2008, 15:23 |
и ты решила, что будет лучше, если мы вместо тебя прогоним в дебаге? ) если под словом "портится" имеется в виду "меняется" и у тебя мелкософтская студия, то рекомендую воспользоваться Debug->New Breakpoint-> New data breakpoint... фича активна только во время дебага узнаешь адрес нужного указателя (то есть &result, или что тебе нужно), нажимаешь F5, и каждый при остановке раз проверяешь, нормальные ли данные. |
Автор: Lazin 22.4.2008, 15:32 |
фигасе рекурсия... ![]() вызывается сначала ф-я myGetFeature класса наследника, потом из нее myGetFeature базового класса, потом в ней myGetMetaFeature базового, которая в свою очередь вызывает myGetFeature наследника... мой мозх... ![]() проще нужно делать, рекурсия в которой участвуют 3 ф-ии 2 из которых это реализации одной и той же виртуальной ф-ии ... хрен там что найдешь отладчиком, там такая логика запутанная... |
Автор: tonchitos 22.4.2008, 15:33 |
а я так и сделала... он портится при выходе из какого-то уровня рекурсии (((( Добавлено @ 15:36 Lazin, попробую...но боюсь напортачить уже ))) )))) Добавлено @ 15:37 хотя...точно такая же рекурсия с обходом дерева и постройкой его работает замичательна |
Автор: tonchitos 22.4.2008, 15:55 | ||||||
млиин.. во время отладки обратила внимание что и адрес резалта меняется..но значение сохраняется............ аааааАААААААААААААААААААААААААААААААААААА ОСЕНИЛО! Добавлено через 3 минуты и 14 секунд кароч...я ж туда ссылочкой передаю...а в рекурсии не ссылочкой...вот адресок то и меняется.. Добавлено через 9 минут и 32 секунды мля... ток хуже стало... Добавлено через 14 минут и 31 секунду
мой вызов... дальше в ф-ии вызываю так base::myGetFeature(pEntity, (mdl::CmdlPetalEntity *)&result, tstrId); дальсче
теперь указатель меняется постоянно...[censored 6] |
Автор: tonchitos 22.4.2008, 16:17 |
люююдииииииииииииииииииииииииииииииии ![]() Добавлено через 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 22.4.2008, 16:30 |
щедрой рукой рассыпаешь по коду пачку assert'ов, IsBad*Ptr'ов и тестируешь. |
Автор: tonchitos 22.4.2008, 16:46 |
зачем ассерты, если при передаче параметра в ф-ию я ссылку передаю, а при входе в ф-ию там уже оказывается параметр с другим адресом...как так ваще.. Добавлено через 3 минуты и 49 секунд тут должен быть какой-то грубый ляп..другого не дано... CmdlPetalFile *pResult(0) вот объект вот передаю ссылку на ентот объект.... GetFeatures.myGetFeature(myDoc->petalFile,(mdl::CmdlPetalEntity * )&pResult, strId) ; а нифига не передается....создается объект с другим адреском.... |
Автор: Rififi 22.4.2008, 17:05 |
в случае полиморфных базовых классов компилятор сам меняет адрес при кастинге, чтобы он указывал на правильный vtable производного класса. |
Автор: tonchitos 22.4.2008, 17:28 |
и как мне быть??? |
Автор: bsa 22.4.2008, 17:29 | ||||
Судя по названию, это указатель. Ты берешь указатель на указатель и приводишь его к типу mdl::CmdlPetalEntity *. Попробуй эту строчку заменить на:
|
Автор: tonchitos 22.4.2008, 17:30 |
кароче - вот как надо было... mdl::CmdlPetalEntity * pResult(0); GetFeatures.myGetFeature(myDoc->petalFile,pResult, strId) ; безо всякого приведения типов и лишних ссылок.... а тут так void myMetaVisitor::myGetFeature(const mdl::CmdlPetalEntity *pEntity, mdl::CmdlPetalEntity* & result, tstring tstrId) и в ф-иях базового класса соответствующе все |
Автор: bsa 22.4.2008, 17:31 |
И вообще. у тебя есть очень серьезная ошибка в проектировании, раз ты применяешь const_cast |
Автор: tonchitos 22.4.2008, 17:45 |
не...никаких конст кастов лишних нет... кост каст есть тока при проверке, что у мя - класс, атрибут, референс и тп.... так например: CmdlClass * pClass = TmdlCast<CmdlClass>(const_cast<CmdlPetalEntity*>(pEntity)); if (pClass) ............ |
Автор: bsa 22.4.2008, 18:01 |
tonchitos, вот он и лишний. Почитай умные книжки. ![]() |