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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Исключение в конструкторе вызывает повреждение, памяти - решение 
:(
    Опции темы
Олег М
Дата 8.7.2004, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да что мы на это несчастное ЦРТ набросились? Проблема-то совсем другом. Royan просто путается в указателях.
Цитата
Все для своих целей в WinAPI следует пользоваться тем, что есть в Win32, а в консоле STL и подобные

А свои-то классы ты хоть используешь? Или только МФЦ, АТЛ и ВинАПИ?

Добавлено @ 13:54
В АТЛ есть ещё CAutoPtr. Тоже самое, что auto_ptr, но не ЦРТ!!!
PM MAIL ICQ   Вверх
Vyacheslav
Дата 8.7.2004, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 59



Цитата

Крайне сомнительная эленантность присутствует в выражении list< MyStruct>::iterator:).
А уж i++ - просто вредно, неокрепшие умы могут подумать что структуры лежат в памяти линейно.

Очень надеюсь, что "неокрепшие умы" прежде всего обратят на тип переменной, по отношению которой применен оператор ++. В противном случае, пускай отправляются учить С++, иначе и без STL можно дров наломать.



Странно. Это понятно
Код

for(int i = 0; i <end;i++)

А это нет ?
Код

for(list< MyStruct>::iterator  i = thelist.begin();  i != thelist.end(); i++)

Ваш пример более неудачен
Замену puch_back (втолкнуть сзади) на add_tail (вставить в хвост) мы пропускаем
Но вот это
Код

for( long lpos = thelist.head(); lpos; lpos = thelist.next( lpos ) )
{
  thelist.get( lpos )->a = 123;
}

lpos - имеет тип long и следовательно это у Вас обычный индекс. Но тогда уж следовало написать проще и заодно задействовать перегрузку оператора []
Код

for( long lpos = thelist.head(); lpos < thelist.end();  lpos++ )
{
  thelist[i]->a = 123;
}


Цитата

Также неуклюжа конструкуия (*i).A - куда естественней i->

А вот здесь вы совершенно правы.
А потому куда бы лучше смотрелось
Код

   for(list< MyStruct>::iterator   i = thelist.begin(); i != thelist.end(); i++)
   {
         
          i->A = 123;

   }


Цитата

что делать, когда требуется отдать итератор в другой модуль, который не имеет доступа к stl классам, а может быть вовсе написан на дельфи - также не ясно.

Не ясно, зачем отдавть итератор. Итератор - это лишь способ доступа к элементам контейнера. Нужно отдавать сам элемент.






--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
AndyY
Дата 8.7.2004, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav

for(int i = 0; i <end;i++)
это, конечно, ясно всем, тут с вами согласен.

for(list< MyStruct>::iterator i = thelist.begin(); i != thelist.end(); i++)
это - не понятно. оно прикидывается индексом, но таковым не является.

lpos - имеет тип long и следовательно это у Вас обычный индекс. Но тогда уж следовало написать проще и заодно задействовать перегрузку оператора []

lpos - не обычный индекс, а ключ доступа (грубо говоря, указатель на некоторую структуру в списке, но по большому счету пользователю классов это по барабану). аналог - POSITION в mfc.
перекрывать operator[] - смысла нет, зачем? синтаксис get c возвращением указателя значительно очевидней.

отдавать итератор - нужно. Например, некая dll экспортит следующий набор функций:

Код

void *get_obj_list();
long first_obj_pos( void *pobj_list );
long next_obj_pos( void *pobj_list, long lpos );
void *get_object( void *pobj_list, long lpos );
void remove_object( void *pobj_list, long lpos );


что отдавать в качестве, если список реализован через STL? Естественно, что-то типа итератора (не сам объект, а ключ доступа к нему). А как?

Да и вовсе маскировать доступ к списку под доступ к массиву - не естественно.

All
mr.Duda просьба не обижать, я его упомянул только как автора кода (типа его copyright)


--------------------
PM MAIL WWW   Вверх
Олег М
Дата 8.7.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
for(list< MyStruct>::iterator i = thelist.begin(); i != thelist.end(); i++)
это - не понятно. оно прикидывается индексом, но таковым не является.

С какой радости оно прикидывается индексом? Это итератор, он им и прикидывается.

Цитата
что отдавать в качестве, если список реализован через STL? Естественно, что-то типа итератора (не сам объект, а ключ доступа к нему). А как?

Вот в этом-то и беда. Я так и не смог добится как из вектора получить указатель на массив. Наверное неглубоко копал?

Цитата
mr.Duda просьба не обижать, я его упомянул только как автора кода (типа его copyright)

А зачем ты приводишь тогда такие примеры?

Повторюсь, что мы ушли в сторону.

PM MAIL ICQ   Вверх
Royan
Дата 8.7.2004, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

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



Ну вы народ и развели флад в топике ... wink.gif
Цитата
А свои-то классы ты хоть используешь? Или только МФЦ, АТЛ и ВинАПИ?

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

Мне интересен такой вопрос - в каких случаях возинкает упомянутая в этом а также в этом: http://forum.vingrad.ru/index.php?showtopic=25717 топике ошибка, (кроме уже описанных)


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Олег М
Дата 9.7.2004, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Мне интересен такой вопрос - в каких случаях возинкает упомянутая в этом а также в этом: http://forum.vingrad.ru/index.php?showtopic=25717 топике ошибка, (кроме уже описанных)

А что за ошибка-то? Ты её хоть выловил?
PM MAIL ICQ   Вверх
Vyacheslav
Дата 9.7.2004, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 59



И все таки. Увидев эту запись, программист владеющий С++ в границах его стандарта (выделено мной) , сразу поймет, что здесь имелось ввиду
Код

   list<MyStruct>  thelist;
   struct MyStruct obj;
   thelist.push_back(obj);
   thelist.push_back(obj);
   thelist.push_back(obj);
   int j = 0;
   for(list< MyStruct>::iterator   i = thelist.begin(); i != thelist.end(); i++)
   {
          i->A = j++;

   }
   ...
   list< MyStruct>::iterator   i = thelist.begin();
   while (i != thelist.end())
       cout << i++->A << endl;

При этом в пределах поставленной задачи, здесь нет ни строчки лишнего кода. Следовательно лаконично и прозрачно для понимания на уровне знания стандарта.
При этом не возникают вопросы типа : а что имелось ввиду под long lpos?, на которые
дают ответы : Это аналог - POSITION в mfc.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
AndyY
Дата 9.7.2004, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav

Код

cout << i++->A << endl;


да, от +, -, > и <, рябит в глазахsmile.gif))
если вы называете это читаемым кодом - нам обсуждать больше нечего. мы просто живем на разных планетах.




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


Эксперт
****


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

Репутация: 9
Всего: 59



А Вы считаете это нечитаемым кодом? Тогда действительно нечего обсуждать раз операция вывода в поток для у Вас вызыает затруднения, или Вам трудно понять приоритеты операций?


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Олег М
Дата 9.7.2004, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
А Вы считаете это нечитаемым кодом? Тогда действительно нечего обсуждать раз операция вывода в поток для у Вас вызыает затруднения, или Вам трудно понять приоритеты операций?

Vyacheslav, AndyY прав. Это не код. Это понты. Лень ставить скобки?

PM MAIL ICQ   Вверх
Vyacheslav
Дата 9.7.2004, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 59



Это не понты. Скобки нужны для переопределения приоритетов. Если приоритеты ясны, так зачем скобки. Для "неокрепших умов" ? Нет, уж спасибо.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
AndyY
Дата 9.7.2004, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav
скобки нужны для экономии денег на этапе багфикса и модификации существующего кода.smile.gif, как и все что говорится о читаемости кода.
чтобы понять ваш код, мне понадобилось вникать примерно 3 секунды. При фиксе баг, когда в голове уже достаточно _важной_ информации, это может быть критичным.

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



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


Эксперт
****


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

Репутация: 9
Всего: 59



В общем замнем эту тему. Андрей, я прочел Ваш "Куда приводит GOTO" и понял, что мы действительно живем на разных планетах.


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Royan
Дата 9.7.2004, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


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

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



2Vyacheslav
Цитата
А что за ошибка-то? Ты её хоть выловил?


Нет не выловил. Это что-то типа выполнения макроса ASSERT() т.е. ошибка происходит в run-time. Фрагмент кода, который "продуцирует" это сообщение после применения оператора delete, приведен здесь: http://forum.vingrad.ru/index.php?showtopic=25717 в асмом первом сообщении.



--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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