Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не пойму где портится указатель ((( 
:(
    Опции темы
tonchitos
Дата 22.4.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



у меня есть класс
Код


class myMetaVisitor : public TmdlMetaVisitor<const CmdlPetalEntity>
{
public:
    myMetaVisitor()
    {}
    virtual ~myMetaVisitor()
    {}
    myTreeCtrl *m_tree;
    
        virtual void Visit(const CmdlPetalEntity* pEntity);
    virtual void myGetFeature(const CmdlPetalEntity* pEntity, mdl::CmdlPetalEntity *result, tstring tstrId);

};



в классе рекурсивная ф-ия
Код



void myMetaVisitor::myGetFeature(const mdl::CmdlPetalEntity *pEntity, mdl::CmdlPetalEntity *result, tstring tstrId)
{
    tstring strId;
    CmdlClass_Category* pCategory = TmdlCast<CmdlClass_Category>(const_cast<CmdlPetalEntity*>(pEntity));
    if (pCategory)
    {
    int i=0;
        pCategory->attr_quid.Encode(strId);
        if (!(i = strcmp((CT2CA)strId.c_str(), (CT2CA)tstrId.c_str())))
            result = pCategory;
    }
    else
    {
        CmdlClass * pClass = TmdlCast<CmdlClass>(const_cast<CmdlPetalEntity*>(pEntity));    
        if (pClass)
        {
            pClass->attr_quid.Encode(strId);
            if (!strcmp((CT2CA)strId.c_str(), (CT2CA)tstrId.c_str()))
                result =  pClass;
            for(int i=0; i < pClass->link_class_attributes.Count(); i++)
            {        
                CmdlClassAttribute* pAttribute = pClass->link_class_attributes[i];
                pAttribute->attr_quid.Encode(strId);
                if (!strcmp((CT2CA)strId.c_str(), (CT2CA)tstrId.c_str()))
                    result = pAttribute;
            }
            for(int i=0; i < pClass->link_operations.Count(); i++)
            {
                CmdlOperation* pOperation = pClass->link_operations[i];
                pOperation->attr_quid.Encode(strId);
                if (!strcmp((CT2CA)strId.c_str(), (CT2CA)tstrId.c_str()))
                    result = pOperation;
                }

        }
    }
    base::myGetFeature(pEntity, result, tstrId);
    
    
}



в ней вызывается ф-ия базового класса
Код



virtual void myGetFeature(T* pObj, mdl::CmdlPetalEntity *result, tstring tstrId)
        {
            ASSERT(pObj);
            if(!TmdlIsKindOf<T>(pObj))
            {
                return;
            }
            const CmdlMetaClass& cMetaClass = pObj->GetMetaClass();
            const CmdlMetaClass::tMetaFeatureVec& cFeatures = m_bVisitOnlyComposite ? cMetaClass.m_AllCompositeFeatures : cMetaClass.m_AllFeatures;
            size_t nSize = cFeatures.size();
            for (size_t i = 0 ; i < nSize ; i++)
            {
        base::myGetMetaFeature(cFeatures[i],pObj, result,tstrId);
            }
        }
        
        virtual void myGetMetaFeature(const CmdlMetaFeature* pMetaFeature, T* pObj, mdl::CmdlPetalEntity *result, tstring tstrId)
        {
            ASSERT(pMetaFeature && pObj);

            // only links are visited by default
            if (pMetaFeature->GetKind() == CmdlMetaFeature::Link && 
                pMetaFeature->m_pfnCount &&
                pMetaFeature->m_pfnGetElement)
            {
                for (tposition pos = 0 ; pos < pMetaFeature->m_pfnCount(const_cast<tUnconst<T*>::tType>(pObj)) ; pos++)
                {
                    myGetFeature(TmdlCast<T>(pMetaFeature->m_pfnGetElement(const_cast<tUnconst<T*>::tType>(pObj),pos)), result, tstrId);
                }
            }
        }



создаю объект класса

    myMetaVisitor GetFeatures;

создаю объект класса, наследованном от mdl::CmdlPetalEntity

CmdlPetalFile pResult;

вызываю ф-ию....

GetFeatures.myGetFeature(myDoc->petalFile,&pResult, strId) ;

суть такая... в ф-ию передается строка с идентификатором выбранного элемента (в дереве)
передается указатель на объект класса с деревом...
передается указатель pResult...
ф-ия ищет совпадение выбранного идентификатора с идентификатором в дереве...если нахгодит - то присваивает указатель на эту фигню. резалту...

присваивает успешно...но потом...в каком то месте при выходе из очередного уровня рекурсии указатель портится....
отладкой так и не получилось выяснить что не так... (((




--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Alek86
Дата 22.4.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



и ты решила, что будет лучше, если мы вместо тебя прогоним в дебаге? )
если под словом "портится" имеется в виду "меняется" и у тебя мелкософтская студия, то рекомендую воспользоваться Debug->New Breakpoint-> New data breakpoint...

фича активна только во время дебага
узнаешь адрес нужного указателя (то есть &result, или что тебе нужно), нажимаешь F5, и каждый при остановке раз проверяешь, нормальные ли данные.



--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 22.4.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



фигасе рекурсия... smile 

вызывается сначала ф-я myGetFeature класса наследника, потом из нее myGetFeature базового класса, потом в ней myGetMetaFeature базового, которая в свою очередь вызывает myGetFeature наследника... мой мозх... smile 

проще нужно делать, рекурсия в которой участвуют 3 ф-ии 2 из которых это реализации одной и той же виртуальной ф-ии ... хрен там что найдешь отладчиком, там такая логика запутанная...
PM MAIL Skype GTalk   Вверх
tonchitos
Дата 22.4.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



а я так и сделала...
он портится при выходе из какого-то уровня рекурсии ((((

Добавлено @ 15:36
Lazin, попробую...но боюсь напортачить уже ))) ))))

Добавлено @ 15:37
хотя...точно такая же рекурсия с обходом дерева и постройкой его работает замичательна



Это сообщение отредактировал(а) tonchitos - 22.4.2008, 15:44


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 22.4.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



млиин.. во время отладки обратила внимание что и адрес резалта меняется..но значение сохраняется............
аааааАААААААААААААААААААААААААААААААААААА
ОСЕНИЛО!

Добавлено через 3 минуты и 14 секунд
кароч...я ж туда ссылочкой передаю...а в рекурсии не ссылочкой...вот адресок то и меняется..

Добавлено через 9 минут и 32 секунды
мля... ток хуже стало...

Добавлено через 14 минут и 31 секунду
Код

    CmdlPetalFile *pResult(0);
    GetFeatures.myGetFeature(myDoc->petalFile,(mdl::CmdlPetalEntity * )&pResult, strId) ;



мой вызов...

дальше в ф-ии вызываю так

    base::myGetFeature(pEntity, (mdl::CmdlPetalEntity *)&result, tstrId);

дальсче 

Код

    virtual void myGetFeature(T* pObj, mdl::CmdlPetalEntity *result, tstring tstrId)
        {
   ...........................
            for (size_t i = 0 ; i < nSize ; i++)
            {
        base::myGetMetaFeature(cFeatures[i],pObj,(mdl::CmdlPetalEntity*)&result,tstrId);
            }
        }


Код

        virtual void myGetMetaFeature(const CmdlMetaFeature* pMetaFeature, T* pObj, mdl::CmdlPetalEntity *result, tstring tstrId)
        {
            .................................
            {
                for (tposition pos = 0 ; pos < pMetaFeature->m_pfnCount(const_cast<tUnconst<T*>::tType>(pObj)) ; pos++)
                {
                    myGetFeature(TmdlCast<T>(pMetaFeature->m_pfnGetElement(const_cast<tUnconst<T*>::tType>(pObj),pos)), (mdl::CmdlPetalEntity*)&result, tstrId);
                }
            }
        }


теперь указатель меняется постоянно...[censored 6]


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 22.4.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



люююдииииииииииииииииииииииииииииииии    smile

Добавлено через 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);




--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Rififi
Дата 22.4.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



щедрой рукой рассыпаешь по коду пачку assert'ов, IsBad*Ptr'ов и тестируешь.
PM MAIL   Вверх
tonchitos
Дата 22.4.2008, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



зачем ассерты, если при передаче параметра в ф-ию я ссылку передаю, а при входе в ф-ию там уже оказывается параметр с другим адресом...как так ваще..

Добавлено через 3 минуты и 49 секунд



тут должен быть какой-то грубый ляп..другого не дано...

CmdlPetalFile *pResult(0)   вот объект

вот передаю ссылку на ентот объект....


    GetFeatures.myGetFeature(myDoc->petalFile,(mdl::CmdlPetalEntity * )&pResult, strId) ;


а нифига не передается....создается объект с другим адреском....


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Rififi
Дата 22.4.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



Цитата(tonchitos @  22.4.2008,  16:46 Найти цитируемый пост)
там уже оказывается параметр с другим адресом

в случае полиморфных базовых классов компилятор сам меняет адрес при кастинге, чтобы он указывал на правильный vtable производного класса.
PM MAIL   Вверх
tonchitos
Дата 22.4.2008, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



и как мне быть???


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
bsa
Дата 22.4.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Код
GetFeatures.myGetFeature(myDoc->petalFile,(mdl::CmdlPetalEntity * )&pResult, strId) ;
Что такое pResult? Какой имеет тип?
Судя по названию, это указатель. Ты берешь указатель на указатель и приводишь его к типу mdl::CmdlPetalEntity *. Попробуй эту строчку заменить на:
Код
GetFeatures.myGetFeature(myDoc->petalFile, pResult, strId);

PM   Вверх
tonchitos
Дата 22.4.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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)


и в ф-иях базового класса соответствующе

все


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
bsa
Дата 22.4.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



И вообще. у тебя есть очень серьезная ошибка в проектировании, раз ты применяешь const_cast
PM   Вверх
tonchitos
Дата 22.4.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: нет
Всего: 40



не...никаких конст кастов лишних нет...

кост каст есть тока при проверке, что у мя - класс, атрибут, референс и тп....


так например:

        CmdlClass * pClass = TmdlCast<CmdlClass>(const_cast<CmdlPetalEntity*>(pEntity));    
        if (pClass)
............


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
bsa
Дата 22.4.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



tonchitos, вот он и лишний. Почитай умные книжки.  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1341 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.