![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Есть итератор. С переходом на новую студию возникла проблема сравнения итератора с NULL. Нужна какой-то аналог NULL .
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
то есть например сделать запись вида
if (m_IterSelected!=NULL) { }; m_IterSelected это итератор на элемент в одном из списков, либо он должен быть равен чему-то типа NULL , если не один элемент не выделен. сделать просто концом списка нельзя потому что студия ругается на сравнение итераторов из разных списков. --------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
мягко говоря, это не область применения С++ итераторов.
сравнивай с правильным. |
||||
|
|||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Дело в том, что вообщем-от уже все написано и работает под предыдущей версией студии. Вопрос в том, как отделаться меньшим злом и перенести все под новую студию?
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
согласен. Ерунда какая-то. Если итератор не инициализирован, то там в общем виде что попало.
а какая разница ? итераторы из разных списков не могут быть равны по определению. Или может тебе надо сравнивать значение, на которое этот итератор указывает? |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Допустим есть два списка list<int> list1 и list<int> list2
и итератор вида list<int>::iterator m_IterSelected; m_IterSelected может указывать как на элементы списка list1 так и на эл-ты list2 , либо вообще никуда не указывать вот третью то ситуацию мне и нужно проверять как-то . В предыдущей версии студии я это делал через присваивание итератору NULL и затем проверки на это. Добавлено через 3 минуты Fazil6 а какая разница ? итераторы из разных списков не могут быть равны по определению. Или может тебе надо сравнивать значение, на которое этот итератор указывает? Проблема в том, что при сравнении итераторов из разных списков программа вылетает, вместо того, чтобы вернуть "не равны"! --------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Как мне тогда перемещаться по STLевскому списку?
--------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
#define _SECURE_SCL 0
вырубает checked итераторы |
|||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Это говорит о том, что нужно понимать, что пишешь, а не тупо доводить программу до вроде бы рабочего состояния. Понятия нулевого итератора не существует. IMHO, теперь самый простой способ выйти из положения - это написать обёртку для итератора, для которой нулевое состояние будет предусмотрено, и сделать соотвествующие замены. Это сообщение отредактировал(а) UnrealMan - 18.9.2007, 17:06 |
||||
|
|||||
| TNT86 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 14.8.2006 Где: Одесса Репутация: нет Всего: нет |
Я и понимал что пишу и был уверен, что такое понятие существует - ведь все пахало. Я построил алгоритм исходя из этого.
Добавлено через 11 минут и 28 секунд #define _SECURE_SCL 0 вроде бы убирает только ворнинги - вылеты программы не исчезают! --------------------
виртуальныe MYSQL и PHP эксперты |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
TNT86, в том то и дело, что ты не понимал. Имхо, сейчас надо просто тупо переписывать. Или, если уж тебе очень надо чтобы этот итератор ссылался на элементы обоих списков, то в том же месте, где делаешь инициализацую итератора, делай инициализацию итератора означающего конец списка.
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Введи вместо итератора boost::optional <iterator> - либо есть, либо нет.
Если буст не используешь - нарисуй что-то похожее: грубо говоря, pair<iterator,bool> + простейшие методы: get, set, reset и isnull. Вместо get можно написать оператор разыменования или оператор(), или даже оператор приведения, вместо set - оператор =. Это чтобы меньше кода править. Самое главное - если просто изменишь тип переменной m_IterSelected на этот optional, компилятор поможет выловить все вхождения и поправить. Если справишься за полчаса, значит, обошелся малой кровью. Если больше - все равно время конечно, но зато запомнишь и больше так не будешь! Вообще, хранить в классе итераторы - дурная привычка. Итератор, по определению, штука временная. -------------------- ... |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Ну, оператор разыменования написать можно и даже нужно. И стрелку в добавок к нему. А функциональный оператор тут совсем не к месту. Оператор преобразования можно сделать разве что для получения какого-нибудь псевдо-bool объекта (например, указателя на член класса). |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Нет, я имела в виду прежде всего цель "малой кровью": оператор приведения (к типу итератора, разумеется) и оператор = позволят сохранить старый код (т.е. он будет компилироваться и работать). Если добавить еще оператор == (int) или (void*) или (лучше) сделать конструктор, который будет принимать 0 (т.е. int\void*) в качестве параметра, да еще + к этому операторы ==\!=, это позволит сохранить в рабочем виде практически весь код. Главное - не перестараться, и со временем все-таки переписать это дело...
-------------------- ... |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
В первую очередь, нужен конструктор, принимающий итератор. Если делать ещё и оператор преобразования к итератору, то перегрузка == и != просто необходима. Но проблема не в этом, а в том, что увеличивается вероятность пропустить какую-нибудь переменную-итератор, которую следует заменить на обёртку. IMHO, получение итератора лучше сделать явным.
Я бы выбрал не int и не void*, а указатель на член какого-нибудь внутреннего класса. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
А почему бы, действительно, не сделать, как сказали выше?? Завести константный list3 пустой. и писать
ведь итератор end определен и для пустого списка, или нет?? |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
ну иметь типа нулевой элемент, когда итератор ни на что не указывает, то направлять его на конец нулевого списка, потом проверять это. Это не подходит разве?
|
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Да, не подходит, потому что сранивать можно только итераторы, относящиеся к одному и тому же объекту-контейнеру.
Это сообщение отредактировал(а) UnrealMan - 22.9.2007, 13:30 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |