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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разименование итератора, что хорошо в 6 студии, то для 7 смерть 
:(
    Опции темы
DENNN
Дата 17.9.2003, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



код в шестой студии (пишу по памяти):
Код

struct MyStruct
{
int [2] var1;
double var2;
//и так далее
}

typedef std::vector<MyStruct> CONT;
CONT my_cont;

//
..в коде место вроде этого
CONT::iterator it;
it=my_cont.begin();
//теперь необходимо передать вызываемой функции адрес начала данных, на который указывает it в виде (void*)
Function(it, my_cont.size());


на последней строке седьмая студия (2003.NET) выкидывает ошибку, мол ну никак она не умеет преобразовывать такой iterator r void*

Пришлось переписать все участки кода так, чтоб обменуть компилятор:
Код

Function((void*)(&(*it)),my_cont.size());

Но за токой код перед другими людьми стыдно! Я понимаю, что в следующей студии изменилась реализация библиотеки, но никак не могу сообразить: как же правильно преобразовать итератор к пустому указателю на этот байт памяти?
PM ICQ   Вверх
RAN
Дата 17.9.2003, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



DENNN, ни очень хорошо так итератор использовать. Если хочешь получить ссылку на структуру, то надо использовать разыменовывание (как во втором коде). Ведь итератор это не всегда указатель, поэтому итератор и ввели. Для единообразия инспользования и vector, и list, и др. Если ты заменишь vector на list, то и 6-ая студия, я думаю, ошибку даст, потому что в list iterator - это класс.
PM MAIL ICQ   Вверх
DENNN
Дата 17.9.2003, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



То есть, ты считаешь что второй вариант - это нормально? И более изящное решение вряд ли возможно.
Просто в проекте работают несколько человек на различных средах и в планах сделать его кроссплатформенным, поэтому хочу для себя это вопрос уяснить окончательно (чтоб в будущем с исходниками таких проблем не возникало).
PM ICQ   Вверх
RAN
Дата 17.9.2003, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Цитата
То есть, ты считаешь что второй вариант - это нормально? И более изящное решение вряд ли возможно

А что делать, если в классе итератора только оператор * перегружен для досупа к данным? По крайней мере это будет везде работать.
Можно макрос написать, что изящней выглядело.
PM MAIL ICQ   Вверх
DENNN
Дата 17.9.2003, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



потом это макрос через несколько файлов протащить придеться, не я лучше тогда так оставлю (второй вариант) smile.gif
Но все равно спасибо.
PM ICQ   Вверх
Fantasist
Дата 17.9.2003, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



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


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


Лентяй
***


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

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



В принципе, глядя на текущую реализацию STL в VC70, пройдет и такое:

Function(reinterpret_cast<void*>(it),my_cont.size());

или в С стиле:

Function((void*)it,my_cont.size());


В принципе, я слышал, что собираются стандартизировать тип итератрора для таких контейнеров как vector, чтобы он был именно указателем на массив, ибо говорят, что этот факт и так все пользуют, полагая что иная реализация не логична.



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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Код
Function((void*)it,my_cont.size());

в 7 не проходит, потому и возникла такая проблема.
Код
reinterpret_cast<void*>(it)

Почему так лучше ?
PM ICQ   Вверх
Fantasist
Дата 17.9.2003, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
в 7 не проходит



Да, действительно, странно. Это что ли в новом стандарте новые правила. Надо будет узнать. Раньше можно было конвертировать что угодно к чему угодно.



Цитата
CODE
reinterpret_cast<void*>(it)

Почему так лучше ?


Рекомендуемый стиль. Во-первых, четко указывает намерение. То есть что ты конвертируешь не к классу наследнику, не используя операторы конвертации и прочие "правильные" преобразования, для коих существует dynamic_cast и static_cast (const_cast слегка слева, но тоже), а именно осуществляешь реинтерпритацию данных. Во-вторых, легче увидеть и найти такое преобразование в коде.

А в VC70 твоя проблема решается просто:


Function(it.base(),my_cont.size());



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


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Цитата
it.base()

Ого, что это?
Как всегда. "Господа программисты, забудьте всё, что мы говорили, утверждали, на чём настаивали до этого. Сегодня это не актуально. Глядите сюда. Теперь всем делать так."
Я надеюсь это расширение стандарта, а не новый подход. А то может MicroSoft и STL решила под себя...

P.S. Простите за эмоции. smile.gif
PM MAIL ICQ   Вверх
Fantasist
Дата 18.9.2003, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Цитата
Я надеюсь это расширение стандарта, а не новый подход


Да это извращение от Microsoft'а. Реализовать итератор как класс выполняющий функции указателя (там только один член - указатель, и все операции типичные для указателя) и определить метод, возвращающей этот указатель. Говорю вам, забейте на Микрософтовскую реализацию и возмите STLPort - это давно хорошо зарекомендовавшая себя библиотека. И не будет у вас проблем.

А насчет стандарта. Он никак не ограничивает реализацию итератора. Она накладывает требования на нее, но совершенно не протестует, если он у тебя будет с расширенными возможностями.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
mr.DUDA
Дата 18.9.2003, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

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



Согласен насчёт StlPort, вещь рульная. И не хранит никакие данные контейнеров в статических компонентах класса (как в мелкософтовской реализаци - из-за чего контейнер, созданный в DLL, не работает в EXE).

А вот почему бы не сделать так:
Код
struct MyStruct
{
    void *ToPtr()  {return (void*)this;}
}

typedef std::vector<MyStruct> CONT;
CONT my_cont;

CONT::iterator it;
it=my_cont.begin();

Function(it->ToPtr(), my_cont.size());

?

Вроде логично.



--------------------
user posted image
PM MAIL WWW   Вверх
DENNN
Дата 18.9.2003, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Цитата
А в VC70 твоя проблема решается просто:

Так вот волнуюсь я как раз из-за того, что через год выдет как-нибудь новая студия и у очердного кодера код компилится не будет. Когда я говорю "ну скомпилируйте в предыдущей студии, она же у вас есть", то некоторые не особо продвинутые граждане начинают крестится и говорить что я мол не использую новейшие достижения. А то что MFC из 6 и 7 не совместимы между собой, так это уже привело к забиванию на МС со всеми их шумными технологиями и использования либо WinAPI, либо нечто вроде GTK smile.gif
Цитата
А вот почему бы не сделать так:

сделать то можно, да только таких различных cтруктур в коде много. Водить множественное наследование тоже не выход, потому что способ лечит не причину а следствие sad.gif
PM ICQ   Вверх
DENNN
Дата 6.10.2003, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

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



Вот наконец-то до этого кода руки дошли. МС опять "радует":
Код

Function(reinterpet_cast<void*>(my_cont.begin()), my_cont.size());

компилер выдает ошибку:
d:\Program Files\GeoFusion\GeoMatrix\src\examples\gmx_view\miniplayer\UniRender.cpp(425): error C2440: 'reinterpret_cast' : cannot convert from 'std::vector<_Ty,_Ax>::iterator' to 'void *'
with
[
_Ty=MyStruct,
_Ax=std::allocator<MyStruct>
]

вот такие пироги с котятами - их едят а они пищат sad.gif

Это сообщение отредактировал(а) DENNN - 6.10.2003, 12:24
PM ICQ   Вверх
RAN
Дата 6.10.2003, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



DENNN, я думаю твоя проблема лечится использованием проверенной STL вместо прилагаемой к VS7
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1304 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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