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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> указатель this 
:(
    Опции темы
comcon1
Дата 1.8.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Поднимаю тему.
Я передаю функции указатель this (на класс Interface, содержащий контайнер hyperarray типа WVector). Так:
Код

data_blck << lex::data_strings(this) << lex::endblock;

Внутри функции пытаюсь получить значение итератора (на самом деле там еще углубление в несколько функций, но везде передается указатель).
Код

data_strings(Interface *at) {
___WVector::iterator rt = int__->hyperarray.begin();
}

Вылетает SEGMENTATION FAULT.
Делаю так. Все работает:
Код

Interface *at = this;
data_blck << lex::data_strings(this) << lex::endblock;
....
....
data_strings(Interface *&at) {
___WVector::iterator rt = int__->hyperarray.begin();
}

Что за шаманизм?? Подробно дать код не могу -- большой. Я не выцплю нужного наглядного места.
Но вот мой вопрос. Какими особыми свойствами обладает этот указатель this, что так происходит???


--------------------
PM MAIL   Вверх
CoreDumped
Дата 2.8.2005, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может быть глюки компилятора
PM MAIL   Вверх
Earnest
Дата 2.8.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Хм...
А почему у функции data_strings не описано возвращаемое значение?
Еще в первом варианте аргумент "Interface *at", а во втором "Interface *&at". Это описка или действительно есть такая разница... и кто такой int__. Непонятно, зачем Interface* передается в data_strings, если вроде не используется.
Еще имя "интерфейс" наводит на интересные размышления. У тебя там точно никто ссылки не считает?

В общем, недостаточно данных. this никакими особым свойствами не обладает, кроме того, что он const (в смысле, нельзя написать this = xxx).
Ничего такого в приведенном коде нет - значит, собака зарыта в том коде, который ты скрыл... smile
На глюки компилятора кивать нечего, это маловероятно - надо разбираться, нельзя такие мины за спиной оставлять.


--------------------
...
PM   Вверх
comcon1
Дата 2.8.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Сорри, он используется.
Код

data_strings(Interface *&at) {
___WVector::iterator rt = at->hyperarray.begin();
}

Копаться в кодах, через которые проходит мой указатель интерфей -- анреал. Дело в том, что я пересоздаю определенный шаблонный класс в иерархии boost::spirit, дабы написать свой актор.
Написанный мною актор-класс, наследуется boost-овским классом, потом этот класс передает мой указатель еще кому-то.. в общем мой указатель путешествует в качестве параметра еще по всему boost-овскому заголовку. smile
(Все таки создатели boost-a извращенцы, потому что актор по другому написать нельзя -- я делал по аналогии с примером.)
Глядя на то, что там во всех шаблонах в загаловках передается ссылка, я поставил ссылку в самом начале (это, разумеется не описка) и заработало.

Вопросы к boost-у.
Мой указатель -- является параметром буустовских шаблонов. А там -- везде передаются ссылки. Я думаю -- в этом дело.


--------------------
PM MAIL   Вверх
comcon1
Дата 2.8.2005, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Вот так, наверное:
this константный -- а значит неконстантную ссылку на него сделать нельзя.
Он передавался как параметр и где-то бууст его воспринял не так как надо. И до меня дошел не указатель, а черт знает что (указателессылка наверное smile).


--------------------
PM MAIL   Вверх
Earnest
Дата 2.8.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Ага, т.е. строка
Код

Interface *at = this;

в начале твоего работающего кода непричем? Уже легче! Тогда ты, видимо, прав. Бывают, к сожалению, такие проблемы с шаблонами - неправильно тип где-нибудь укажешь, и такие чудеса начинаются! В лучшем случае - компилятор трехэтажно ругается, в худшем - падает, как у тебя.
Boost тут в общем-то не причем - это работа с шаблонами пока реализована не так хорошо как хотелось бы.
Ничего, со временем привыкнешь, и заранее будешь знать, где мины лежат... smile

Почему там ссылка у буста - наверняка есть причина. А вообще не напрасно ли ты указатель используешь? Может, лучше просто сам класс - если там и так все по ссылке передается. Как-то использование указателей не очень в духе буста.



--------------------
...
PM   Вверх
comcon1
Дата 3.8.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Действительно не в духе, это у меня. На самом деле там не так все страшно.
Просто я не привык еще.
А компиляторы действительно с шаблонами чудеса творят. И диагностика совершенно нечитабельна - хорошо если строчку укажут, где ошибка.


--------------------
PM MAIL   Вверх
Earnest
Дата 3.8.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Ну, я считаю, что у VC 7.1 с диагностикой вполне неплохо (а по сравнению с 6, так и вообще волшебно). Читать тяжеловато, но это из-за длинных имен. Я, когда сразу не понимаю, чего на меня ругаются, копирую сообщение в нотепад и сокращаю имена - выкидываю пространства имен, параметры шаблонов и т.д., потому что контекст обычно очевиден. И сообщение приводится к чему-нибудь типа "не могу не консту присвоить конст"... Слава богу, это редко бывает нужно.
Сорри за оффтопик.


--------------------
...
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.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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