![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| comcon1 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Поднимаю тему.
Я передаю функции указатель this (на класс Interface, содержащий контайнер hyperarray типа WVector). Так:
Внутри функции пытаюсь получить значение итератора (на самом деле там еще углубление в несколько функций, но везде передается указатель).
Вылетает SEGMENTATION FAULT. Делаю так. Все работает:
Что за шаманизм?? Подробно дать код не могу -- большой. Я не выцплю нужного наглядного места. Но вот мой вопрос. Какими особыми свойствами обладает этот указатель this, что так происходит??? |
||||||
|
|||||||
| CoreDumped |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 1.8.2005 Репутация: нет Всего: 1 |
Может быть глюки компилятора
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Хм...
А почему у функции data_strings не описано возвращаемое значение? Еще в первом варианте аргумент "Interface *at", а во втором "Interface *&at". Это описка или действительно есть такая разница... и кто такой int__. Непонятно, зачем Interface* передается в data_strings, если вроде не используется. Еще имя "интерфейс" наводит на интересные размышления. У тебя там точно никто ссылки не считает? В общем, недостаточно данных. this никакими особым свойствами не обладает, кроме того, что он const (в смысле, нельзя написать this = xxx). Ничего такого в приведенном коде нет - значит, собака зарыта в том коде, который ты скрыл... На глюки компилятора кивать нечего, это маловероятно - надо разбираться, нельзя такие мины за спиной оставлять. -------------------- ... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Сорри, он используется.
Копаться в кодах, через которые проходит мой указатель интерфей -- анреал. Дело в том, что я пересоздаю определенный шаблонный класс в иерархии boost::spirit, дабы написать свой актор. Написанный мною актор-класс, наследуется boost-овским классом, потом этот класс передает мой указатель еще кому-то.. в общем мой указатель путешествует в качестве параметра еще по всему boost-овскому заголовку. (Все таки создатели boost-a извращенцы, потому что актор по другому написать нельзя -- я делал по аналогии с примером.) Глядя на то, что там во всех шаблонах в загаловках передается ссылка, я поставил ссылку в самом начале (это, разумеется не описка) и заработало. Вопросы к boost-у. Мой указатель -- является параметром буустовских шаблонов. А там -- везде передаются ссылки. Я думаю -- в этом дело. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Вот так, наверное:
this константный -- а значит неконстантную ссылку на него сделать нельзя. Он передавался как параметр и где-то бууст его воспринял не так как надо. И до меня дошел не указатель, а черт знает что (указателессылка наверное |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ага, т.е. строка
в начале твоего работающего кода непричем? Уже легче! Тогда ты, видимо, прав. Бывают, к сожалению, такие проблемы с шаблонами - неправильно тип где-нибудь укажешь, и такие чудеса начинаются! В лучшем случае - компилятор трехэтажно ругается, в худшем - падает, как у тебя. Boost тут в общем-то не причем - это работа с шаблонами пока реализована не так хорошо как хотелось бы. Ничего, со временем привыкнешь, и заранее будешь знать, где мины лежат... Почему там ссылка у буста - наверняка есть причина. А вообще не напрасно ли ты указатель используешь? Может, лучше просто сам класс - если там и так все по ссылке передается. Как-то использование указателей не очень в духе буста. -------------------- ... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Действительно не в духе, это у меня. На самом деле там не так все страшно.
Просто я не привык еще. А компиляторы действительно с шаблонами чудеса творят. И диагностика совершенно нечитабельна - хорошо если строчку укажут, где ошибка. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ну, я считаю, что у VC 7.1 с диагностикой вполне неплохо (а по сравнению с 6, так и вообще волшебно). Читать тяжеловато, но это из-за длинных имен. Я, когда сразу не понимаю, чего на меня ругаются, копирую сообщение в нотепад и сокращаю имена - выкидываю пространства имен, параметры шаблонов и т.д., потому что контекст обычно очевиден. И сообщение приводится к чему-нибудь типа "не могу не консту присвоить конст"... Слава богу, это редко бывает нужно.
Сорри за оффтопик. -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |