Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как не надо писать код


Автор: Ignat 18.3.2006, 06:52
Это не вопрос, а скорее крик души.
Месяца два с половиной, в свободное от работы время, мучаю проект. И вот, похоже, настал конец терпению.
Чем больше разбираюсь в этом коде, тем больше хренею (другое слово не подберешь).
Яркий пример того, как не надо писать.
По порядку:

1. Видимо, все знание автора об отличиях С от С++ сводится к наличию единственного класса, единственный экземпляр которого инстанцирован в структуру(!), что само по себе нормально, за исключением того вопроса на фига это там было нужно, для меня так и
осталось загадкой.

2. Догадайтесь как обстоят дела с выделением памяти? Именно, незабвенный malloc. По некоторому стечению обстоятельств, функций free я обнаружил меньше :\

3. С потоками такая же напряженнка, как и с выделением new. #include <stdio.h> и точка, нафиг нам стримы?

4. Собственно от чего я сегодня опупел - static-функции вне класса. Честно сознаюсь, никогда так не извращался, посему тот факт, что я её фиг увижу за пределами единицы трансляции поверг меня в уныние. Нэймспейсы, видимо, отменили специально для "аффтара". Для чего это вообще делалось, так и не понял.

5. Об RTTI тоже автору ничего не известно. Следствие - около полусотни варнингов об опасном присваивании при компиляции.

6. Никакого намека на STL. Я, конечно, рад что в программе так классно реализованы операции с массивами, массивами указателей, массивами указателей на указатели, указателями на массивы указателей на указатели. Но, блин, чтоб выбрать элемент по имени,
мне перебор прикажете делать?

7. Отдельная песня - это имена переменных и функций. Ни один шпион не догадается. Если комменты не прочитает. Вот только комменты в .h, а нужно работать с реализацией.
Вот как вы думаете, зачем нужен следующий код:
void stdexitcls(char s, float pt, float sl, int bth)
{ sexord=1; sexi=s; sexpt=ptt(pt); sexsl=ptt(sl); sexbrs=bth; };
Вот я тоже не телепат. Смотрим объявление, например:
char sexi; // standard exit id
Вот ведь, блин, а я уж было подумал... Оказывается sexi и отношения к сексу не имеет, разве что церебральному.

8. Вернёмся к классу. Убедившись, что править что-то в этом коде сродни подвигам Геракла, вместе взятым есессно, решил воспользоваться одним из базовых столпов ООП - полиморфизмом. Унаследовал класс, написал свою реализацию нужных мне методов, а вот не переопределенные методы вдруг перестали работать. Удивительно? А мне нет. Те члены класса, которыми они пользуются были объявлены в приватной секции, а совсем не protected.

Блин, по скромной оценке кода больше тысячи строк... Как дальше с этим работать просто загадка тысячелетия. Но если назвался груздем...

Были ли у вас такие подлянки? Как мне дальше разгребать?

Автор: chipset 18.3.2006, 07:09
С чем я встречался:
9. Переопределение оператора new/delete -- руки отрывать.
10. switch на 10 вариантов.
11. Функции принимающие 10 (да-да, 10) параметров.
Цитата(Ignat @ 17.3.2006, 20:52 Найти цитируемый пост)
Блин, по скромной оценке кода больше тысячи строк... Как дальше с этим работать просто загадка тысячелетия. Но если назвался груздем...

Если там всего 1000 строк лучше переписать к чертям собачьим, такое и рефакторить низзя.

Автор: Ignat 18.3.2006, 12:38
Цитата(chipset @ 18.3.2006, 07:09 Найти цитируемый пост)
Если там всего 1000 строк лучше переписать к чертям собачьим, такое и рефакторить низзя.

Ну это я сильно поскромничал, 1000 строк - это только та часть, с которой я работаю, даже, наверное 1500-2000 будет точнее, остальное было скомпилено в либы и благопулучно забыто. Общее количество строк в проекте (только .cpp и .с файлы, без учета хидеров) 14 225. Если это дело реверсить, то придется поднимать всё. А мой неокрепший организм такого мазохизма не вынесет...


Цитата(chipset @ 18.3.2006, 07:09 Найти цитируемый пост)
11. Функции принимающие 10 (да-да, 10) параметров.

Фунция, на которой я споткнулся в п.4 принимает 13 параметров.

Цитата(chipset @ 18.3.2006, 07:09 Найти цитируемый пост)
10. switch на 10 вариантов.

Здесь я натыкался на switch из 25-27 вариантов, хотя ИМХО это не страшно. Если задача отправить мессагу об ошибке, то самый приемлимый вариант.

Автор: Mayk 18.3.2006, 13:25
Пинать. Аффатру явно забыли сообщить что имена переменных можно делать из >6 символов и читабельными


Цитата(Ignat @ 18.3.2006, 10:52 Найти цитируемый пост)
Как мне дальше разгребать?

Цитата(chipset @ 18.3.2006, 11:09 Найти цитируемый пост)

Если там всего 1000 строк лучше переписать к чертям собачьим, такое и рефакторить низзя.

+1
Верни это на ту помойку из которой..... на родину вообщем.





Цитата(Ignat @ 18.3.2006, 16:38 Найти цитируемый пост)

Здесь я натыкался на switch из 25-27 вариантов, хотя ИМХО это не страшно. Если задача отправить мессагу об ошибке, то самый приемлимый вариант.

а как же map<ErrorID, string> и exception::what()?

Автор: Ignat 18.3.2006, 13:30
Цитата(Mayk @ 18.3.2006, 13:25 Найти цитируемый пост)
map<ErrorID, string> и exception::what()?

Посыпаю голову smile

ЗЫ кстати, exception отсутствует, зато есть глобальная функция FatalError. С однозначной реакцией умереть нафик, даже если это не нужно.

Автор: DeadSoul 18.3.2006, 13:37
Цитата(Ignat @ 18.3.2006, 06:52 Найти цитируемый пост)
char sexi; // standard exit id

smile

Автор: Athlon 18.3.2006, 20:35
если ты разгребаешь opensource код, то это типичная ситуация smile
а вообще, хочется всем пожелать побольше внимания уделять комментариям !!!

Автор: Earnest 20.3.2006, 18:06
Что делать:
если исходный код работает правильно, лучше его не трогать, а написать свой фасад или адаптер. Причем сначала спроектировать интерфейс, не глядя в это г., а потом попробовать реализовать его.

Если неправильно - забыть про него совсем и переписать.

Автор: S.A.P. 20.3.2006, 18:20
Часто на работе сталкиваюсь с такими комментариями одного товарища:
1. // Пока не конец.
2. // В массив.
3. // Составляем запрос.
4. // Всё...

и т.д. И ни одного толкового комментария. Лучше вобще их не писать тогда smile .

Автор: Ignat 20.3.2006, 18:24
Цитата(Earnest @ 20.3.2006, 18:06 Найти цитируемый пост)
если исходный код работает правильно,

Работает правильно.

Цитата(Earnest @ 20.3.2006, 18:06 Найти цитируемый пост)
а написать свой фасад или адаптер.

Вот это я и делаю, но в процессе приходится выяснять логику, тут и начинается свистопляска.

Цитата(Earnest @ 20.3.2006, 18:06 Найти цитируемый пост)
Причем сначала спроектировать интерфейс, не глядя в это г.,

Очень ценное замечание. Спасибо, так и поступлю. smile

Цитата(Earnest @ 20.3.2006, 18:06 Найти цитируемый пост)
Если неправильно - забыть про него совсем и переписать.

14 тыс строк?

Автор: Earnest 20.3.2006, 18:58
Цитата(Ignat @ 20.3.2006, 18:24 Найти цитируемый пост)
14 тыс строк?

Не факт, что в результате будет столько же.
Но поскольку
Цитата(Ignat @ 20.3.2006, 18:24 Найти цитируемый пост)
Работает правильно.

то, конечно, лучше не трогать, не смотря на
Цитата(Ignat @ 20.3.2006, 18:24 Найти цитируемый пост)
но в процессе приходится выяснять логику, тут и начинается свистопляска.

А кому сейчас легко? smile smile smile

Автор: DeadSoul 20.3.2006, 22:45
Цитата(Earnest @ 20.3.2006, 18:06 Найти цитируемый пост)
Что делать:
если исходный код работает правильно, лучше его не трогать, а написать свой фасад или адаптер. Причем сначала спроектировать интерфейс, не глядя в это г., а потом попробовать реализовать его.

Если неправильно - забыть про него совсем и переписать.


Earnest, а если надо что-то изменить в поведение этой функции? А рефакторинг провести нереально?

Автор: chipset 21.3.2006, 01:23
Цитата(DeadSoul @ 20.3.2006, 12:45 Найти цитируемый пост)
Earnest, а если надо что-то изменить в поведение этой функции? А рефакторинг провести нереально?

Мы живем не в идеальном мире, рефакторинг нужно проводить только когда его нужно проводить а не просто потому-что так хочеться (ну если конечно, у тебя это не хобби)

Автор: UnixBeginner 21.3.2006, 13:19
Есть прикольная книженция о том, как желательно оформлять исходный код программ.
Вот только не нашел как тут файлик присоеденить, так что если кому нужна (она небольшая *.doc),
могу скинуть или выложить где скажите smile

Автор: np9mi7 21.3.2006, 13:35
Цитата
Цитата(Ignat @ 18.3.2006, 16:38 Найти цитируемый пост)

Здесь я натыкался на switch из 25-27 вариантов, хотя ИМХО это не страшно. Если задача отправить мессагу об ошибке, то самый приемлимый вариант.

а как же map<ErrorID, string> и exception::what()?
, а файл ресурсов?

Цитата
11. Функции принимающие 10 (да-да, 10) параметров.
, иногда в *.dll для независимости от клиента приходиться писать и больше, так что это в зависимости от задачи, на мой взгляд;

12) Hard Code (сообщения, числа и.т.д.);
13) Non Const Global Variable (просто бесит что вместо стека используется глобальная свалка - функциональное программирование);
14) Memory Leak (только стратегия владения и сборка мусора);
15) Native Implementation Dependence (бесит, когда пишут код зависимый от реализации);

Автор: bilbobagginz 21.3.2006, 13:44
насчет всего того что код предыдущего кодера иногда писан через одно место:
вопрос какая задача стояла у программиста предыдущего кодa.
Oбычно интересный проект - пайлот, когда заказчик еще сам не знает чего надо досконально,
и описывает задачу в процессе реализации. также возможны подводные камни которые без опыта обнаружатся тоже в процессе реализации. можно не взять такой заказ, а можно взять.
когда берешь, имеет место быть шанс плохого дезайна.

есть конечно тривиальные задачи, которые не нужно "разрабатывать" - взял шаблон и шаблонь.
но не всегда.

но ногами писАть, согласен - нехорошо!

Автор: UnrealMan 30.3.2006, 14:26
Цитата(Ignat @ 18.3.2006, 06:52)
2. Догадайтесь как обстоят дела с выделением памяти? Именно, незабвенный malloc.

А чем собс-но плох malloc? В случае, когда используются нетривиальные объекты (с конструктором, деструктором), и требуется перевыделение памяти с сохранением данных (realloc), использование new и delete – явно не самое удачное решение.

Автор: likehood 30.3.2006, 17:38
Цитата(UnrealMan @ 30.3.2006, 14:26 Найти цитируемый пост)
В случае, когда используются нетривиальные объекты (с конструктором, деструктором), и требуется перевыделение памяти с сохранением данных (realloc), использование new и delete – явно не самое удачное решение.

А как ты собрался вызывать коструктор из маллока? smile

Хотя, конечно, в данном случае new и delete не особо нужны - классов то все равно нет.

Автор: DeadSoul 30.3.2006, 21:57
Цитата(UnrealMan @ 30.3.2006, 14:26 Найти цитируемый пост)
А чем собс-но плох malloc?

1. (Как сказали выше) Ничего не знает про конструкторы\деструкторы
2. Для malloca нет smart pointer-ов


Цитата(UnrealMan @ 30.3.2006, 14:26 Найти цитируемый пост)
и требуется перевыделение памяти с сохранением данных (realloc), использование new и delete – явно не самое удачное решение

Самое лучшее решен ие в таком случае - std::vector, но никак не realloc

Автор: UnrealMan 31.3.2006, 09:13
Цитата(baronp @ 30.3.2006, 17:38)
А как ты собрался вызывать коструктор из маллока?

Ясное дело, конструктор вызывается отдельно.

Цитата(DeadSoul @ 30.3.2006, 21:57)
Цитата(UnrealMan @ 30.3.2006, 14:26)
А чем собс-но плох malloc?

1. (Как сказали выше) Ничего не знает про конструкторы\деструкторы

И что? Самому сложно добавить их вызов?

Цитата
2. Для malloca нет smart pointer-ов

Не велика потеря. При желании можно написать свои.

Цитата
Самое лучшее решение в таком случае - std::vector, но никак не realloc

Чем же оно самое лучшее? Быcтрей работает что ли (во всех ситуациях)?

Автор: likehood 31.3.2006, 10:31
Цитата(UnrealMan @ 31.3.2006, 09:13 Найти цитируемый пост)
А как ты собрался вызывать коструктор из маллока?

Ясное дело, конструктор вызывается отдельно.

Что??? Явный вызов конструктора по указателю? Ты на каком языке пишешь?

Цитата(UnrealMan @ 31.3.2006, 09:13 Найти цитируемый пост)
И что? Самому сложно добавить их вызов?

Да ты что, это же мое любимое занятие - делать работу за компилятора. smile

Цитата(UnrealMan @ 31.3.2006, 09:13 Найти цитируемый пост)
2. Для malloca нет smart pointer-ов

А причем тут умные указатели? Для них просто перегружают некоторые операции,
но совсем не обязательно перегружать new и delete.


Цитата(UnrealMan @ 31.3.2006, 09:13 Найти цитируемый пост)
Чем же оно самое лучшее? Быcтрей работает что ли (во всех ситуациях)?

Лучшее - не значит самое быстрое. А то бы все писали на Си и Асме.

Автор: UnrealMan 31.3.2006, 16:27
Цитата(baronp @ 31.3.2006, 10:31)
Что??? Явный вызов конструктора по указателю?

Ну, да. А что тут, собс-но, смущает?

Цитата
Цитата(UnrealMan @ 31.3.2006, 09:13)
И что? Самому сложно добавить их вызов?

Да ты что, это же мое любимое занятие - делать работу за компилятора.

Ну, макросы ещё вроде бы никто не отменял:

Код
#define New(p, size, type) \
{ \
    (p) = (type *)malloc((size)*sizeof(type)); \
    if (p) \
        for (int i=0; i<size; i++) \
            ((p)+i)->type::type(); \
}

Правда, чтобы эта штуковина заработала внутри шаблонов, придётся ещё повозиться :-‎)

Цитата
Лучшее - не значит самое быстрое.

В некоторых ситуациях быстрота существенна.

Автор: DeadSoul 31.3.2006, 23:53
Цитата(UnrealMan @ 31.3.2006, 09:13 Найти цитируемый пост)
Цитата
Самое лучшее решение в таком случае - std::vector, но никак не realloc
Чем же оно самое лучшее? Быcтрей работает что ли (во всех ситуациях)?

Велосепидисты вперед!

Цитата(UnrealMan @ 31.3.2006, 09:13 Найти цитируемый пост)
Цитата
2. Для malloca нет smart pointer-ов
Не велика потеря. При желании можно написать свои.

Еще раз вперед

Цитата(UnrealMan @ 31.3.2006, 16:27 Найти цитируемый пост)
Ну, макросы ещё вроде бы никто не отменял:

А что знают макросы про области видимости и пространства имен?

Автор: UnrealMan 1.4.2006, 10:00
Цитата(DeadSoul @ 31.3.2006, 23:53)
А что знают макросы про области видимости и пространства имен?

То же, что и new :-‎) Ну, и? Это типа повод использовать везде и всюду std::vector?

Я-то, в общем-то, не выдвигаю здесь тезис в духе «malloc рулит, всё остальное голимый отстой», а только спрашиваю, почему само по себе использование malloc (независимо от того, какая задача решается) вызывает этакое презрение.

Автор: DeadSoul 1.4.2006, 11:26
Цитата(UnrealMan @ 1.4.2006, 10:00 Найти цитируемый пост)
Я-то, в общем-то, не выдвигаю здесь тезис в духе «malloc рулит, всё остальное голимый отстой», а только спрашиваю, почему само по себе использование malloc (независимо от того, какая задача решается) вызывает этакое презрение.

Потому, что для new все уже написано.

Автор: UnrealMan 1.4.2006, 18:02
Цитата(DeadSoul @ 1.4.2006, 11:26)
Потому, что для new все уже написано.

Потому, что предрассудки всё это :-‎)

Автор: DeadSoul 1.4.2006, 18:37
Цитата(UnrealMan @ 1.4.2006, 18:02 Найти цитируемый пост)
Цитата(DeadSoul @ 1.4.2006, 11:26)
Потому, что для new все уже написано.
Потому, что предрассудки всё это :-‎)

Это не предрассудки. Это деньги. За последний год я ни разу не написал delete или delete[]. Умные указатели\STL рулят

Автор: UnrealMan 2.4.2006, 09:41
Примитивно это как-то – выискивать некий самый лучший способ на все случаи жизни. Всё зависит от требований задачи. И вот уж как не надо писать код, так это без учёта этих самых требований, руководствуясь только лишь мыслью «а у меня уже есть самый-самый крутой способ, я буду с превеликим благоговением молиться на него и использовать везде во всех своих программах».

Автор: likehood 2.4.2006, 10:19
Цитата(UnrealMan @ 2.4.2006, 09:41 Найти цитируемый пост)
Примитивно это как-то – выискивать некий самый лучший способ на все случаи жизни.

Да вот как раз не выискивать лучшие способы примитивно, только не на все случаи жизни, а на большую их часть. Если меня устраивает быстродействие new/delete, то почему я должет отказываться от них? Но в любом случае malloc - не лучшее решение, правильнее будет перегрузить new/delete. В любом случае, для использования malloc должны быть очень веские причины и вряд ли в том г. про которое говорил Ignat они были (кроме плохого знания С++).

P.S. 2UnrealMan А на счет явного вызова конструктора - признаю, не знал. Просто никогда не доводилось пользоваться. Решил проверить первым попавшимся под руку компилером - это был 6-й Билдер. Билдер дал по рукам.
После твоего поста:

Цитата(UnrealMan @ 31.3.2006, 16:27 Найти цитируемый пост)
Что??? Явный вызов конструктора по указателю?

Ну, да. А что тут, собс-но, смущает?


попробовал еще раз - на этот раз в VC6. Все прошло в лучшем виде. Правду говорят - Билдер это зло.

Автор: UnrealMan 2.4.2006, 11:48
Цитата(baronp @ 2.4.2006, 10:19)
Если меня устраивает быстродействие new/delete, то почему я должен отказываться от них?

Отказываться от new и delete я и не призываю. Да и к быстродействию самих по себе new/delete я никаких претензий не имею – собс-но, если я чего не путаю, они вызывают те же malloc и free, а потому по скорости работают одинаково. Хотя есть и функции, которые работают пошустрей, например, AllocMemory и FreeMemory (bhsupp.dll). Однако ж я не вижу причин полного отказа от malloc.

Цитата
Но в любом случае malloc - не лучшее решение, правильнее будет перегрузить new/delete.

Обоснования этой правильности?

Цитата
В любом случае, для использования malloc должны быть очень веские причины

Ну прям очень. Один и тот же результат (в отношении тривиальных объектов без конструкторов), но new всё равно лучше! :-‎) В это надо просто уверовать...

Цитата
попробовал еще раз - на этот раз в VC6. Все прошло в лучшем виде. Правду говорят - Билдер это зло.

А как ты в builder'е пробовал-то вызывать конструктор? Так:
pointer->Class() или так:
pointer->Class::Class() ?

Автор: likehood 2.4.2006, 15:52
Цитата(UnrealMan @ 2.4.2006, 11:48 Найти цитируемый пост)
Да и к быстродействию самих по себе new/delete я никаких претензий не имею – собс-но, если я чего не путаю, они вызывают те же malloc и free, а потому по скорости работают одинаково.

На практике все же new и delete работают насколько медленнее. Можно для проверки написать тест, но в любом случае эта разница будет совсем небольшая. Здесь все зависит от компилятора.


Цитата(UnrealMan @ 2.4.2006, 11:48 Найти цитируемый пост)
Однако ж я не вижу причин полного отказа от malloc.

А я не вижу причин его использования. Если конечно мы пишем на С++, а не на С.

Imho, это разговор в никуда - как всегда договоримся, что malloc рулит (что надо еще доказать), но только в 0,0001% случаях, а в остальном использование malloc'а - пережиток времен С. В итоге и те и другие будут правы, а кто выделял память malloc'ом так и будут это делать. Пора тему закрывать.


Цитата(UnrealMan @ 2.4.2006, 11:48 Найти цитируемый пост)
А как ты в builder'е пробовал-то вызывать конструктор? Так:
pointer->Class() или так:
pointer->Class::Class() ?

Да и так и эдак - Builder не знает метода Class().
В VC6 второй вызов работает как надо, можно даже не через указатель а напрямую.
Но все это imho нужно не более, чем какой-нибудь const_cast. Кто-нить им хоть раз пользовался?

Автор: Daevaorn 2.4.2006, 19:55
Цитата(baronp @ 2.4.2006, 16:52 Найти цитируемый пост)
Цитата(UnrealMan @ 2.4.2006, 11:48 )
А как ты в builder'е пробовал-то вызывать конструктор? Так:
pointer->Class() или так:
pointer->Class::Class() ?


Да и так и эдак - Builder не знает метода Class().
В VC6 второй вызов работает как надо, можно даже не через указатель а напрямую.
Но все это imho нужно не более, чем какой-нибудь const_cast. Кто-нить им хоть раз пользовался?

Ну вы блин даете. Кто же так конструктор класса вызывает, а? Где это так написано?
Код

class Foo
{
public:
   Foo( int );
};
Foo* p = (Foo*)malloc( sizeof( Foo ) );
new(p) Foo(777);

Если vc компилит это ещё не значит что правильно. smile

Автор: UnrealMan 3.4.2006, 10:56
 
Цитата(baronp @ 2.4.2006, 15:52)
На практике все же new и delete работают насколько медленнее. Можно для проверки написать тест, но в любом случае эта разница будет совсем небольшая.

Зато есть большая разница в скорости (десятки раз) выделения разных объёмов памяти (так сказать, камешек в огород std::‎). Причём вся эта разница красуется на интервале малых объёмов (где-то до 1кБ).

Цитата(Daevaorn @ 2.4.2006, 19:55)
Ну вы блин даете. Кто же так конструктор класса вызывает, а? Где это так написано?

:-‎) Дык, эт я методом тыка нашёл сей способ :-‎) Впрочем, я ожидал, что он может оказаться непереносимым.

Кстати, как этому void *operator new(size_t, void *) соответствующий delete прописать? (а то мой компилятор ругается, а я уже не помню, как это дело улаживается)  

Автор: Daevaorn 3.4.2006, 18:47
Цитата(UnrealMan @ 3.4.2006, 11:56 Найти цитируемый пост)
Кстати, как этому void *operator new(size_t, void *) соответствующий delete прописать?

А он не нуженsmile
Код

class Foo
{
public:
   Foo( int );
};
Foo* p = (Foo*)malloc( sizeof( Foo ) );
new(p) Foo(777);
//...
p->~Foo();
free( p );

Автор: UnrealMan 4.4.2006, 09:46
Цитата(Daevaorn @ 3.4.2006, 18:47)
А он не нужен

Да вроде как желателен:

Код
void *operator new(size_t size, void *p)
{
    return p;
}

struct Struct
{
    Struct() {}
    ~Struct() {}
};

void AllocStruct()
{
    Struct* p = (Struct *)malloc(sizeof(Struct));
    new(p) Struct();
    //...
    p->~Struct();
    free( p );
}

MSVC++6.0: warning C4291: 'void *__cdecl operator new(unsigned int,void *)' : no matching operator delete found; memory will not be freed if initialization throws an exception

Автор: Earnest 4.4.2006, 18:17
Для каждой формы new (т.е. набора дополнительных аргументов) должна быть соответствующая форма delete (c тем же набором дополнительных аргументов). Для того редкого случая, когда исключение будет возбуждено сразу после благополучного выделения памяти (т.е. в конструкторе). Что, собственно, и написано в предупреждении.
Странно, что компилятор не предоставляет стандартный размещающий delete (тогда как размещающий new есть). Возможно, это "особенности" VC 6. Но теоретически никто не мешает написать размещающий delete (он просто ничего не делает). Или просто забить на предупреждение (отклбючив его, чтобы не травмировать психику). smile

Автор: ManiaK 10.4.2006, 13:07
Что-то какой-то жёсткий флуд пошёл, а ведь так забавно всё начиналось... smile

Ignat, я, видимо, в этих вопросах избалован больше smile Такой долбанутости как смвыше не встречал (недавно во всяком случае). Поэтому приходится обращать внимание на такое (надо ж на что-то ругаться):

Код

int func(int a, int b) { a = 3; // Типа место экономим :-)
    b =
          5;// А здесь вообще хз...

return 0;// Начальный отступ - самое частое, что встречаю...
}


Цитата(chipset @ 18.3.2006, 07:09 Найти цитируемый пост)
Переопределение оператора new/delete -- руки отрывать.

Я бы поправил - глобальное переопределение. Переопределение этих операторов в каком-либо классе для меня даже приятно smile До определённой поры, конечно.

Цитата(Ignat @ 18.3.2006, 12:38 Найти цитируемый пост)
Фунция, на которой я споткнулся в п.4 принимает 13 параметров.

А вот это - да. Плохо, значит, продумано, раз такие функции приходится создавать.

Автор: UnrealMan 11.4.2006, 14:42
Цитата(ManiaK @ 10.4.2006, 13:07)
Цитата(Ignat @  18.3.2006,  12:38 Найти цитируемый пост)
Фунция, на которой я споткнулся в п.4 принимает 13 параметров.

А вот это - да. Плохо, значит, продумано, раз такие функции приходится создавать.

Ага, CreateWindowEx в топку: она юзает 12 параметров :-)

Цитата(Earnest @ 4.4.2006, 18:17)
Для каждой формы new (т.е. набора дополнительных аргументов) должна быть соответствующая форма delete (c тем же набором дополнительных аргументов).

Вопрос был в том, как её правильно прописать (чтоб предупреждение убралось).

Автор: Ignat 11.4.2006, 14:51
Цитата(UnrealMan @ 11.4.2006, 15:42 Найти цитируемый пост)
Ага, CteateWindowEx в топку: она юзает 12 параметров

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

Автор: Hose 11.4.2006, 15:36
Ох задело не удержался.

На мой взгляд людям, которые без супер-пупер везких причин используют такие пережитки прошлого, как malloc(), а уж тем более явно вызывают конструктор класса, необходимо как можно скорее прижечь раскаленной качергой то место, которое у нех почему-то чешется.
Я считаю, что если ты один делаешь программу для себя, то можешь хоть всю ее из макросов сделать в одном .cpp файле, не написав ни одного коментария.
Но если ты пишешь программу не один, если ее объем достаточно большой, если твой код в будущем кому-то придется использовать, так буть добр действуй по общепринятым правилам.

А теперь по теме. Лично меня больше всего бесит в чужом коде это псевдо крутые программерские фишки типа макросов или жуткого сокращения кода.

P.S. для общего развития - чем плох switch на 10 вариантов?

Автор: DeadSoul 11.4.2006, 21:29
Цитата(Hose @ 11.4.2006, 15:36 Найти цитируемый пост)
P.S. для общего развития - чем плох switch на 10 вариантов?

Смотря в какой ситуации он используется.smile

Автор: Earnest 13.4.2006, 12:04
Цитата(UnrealMan @ 11.4.2006, 15:42 Найти цитируемый пост)
Цитата(Earnest @ 4.4.2006, 18:17)
Для каждой формы new (т.е. набора дополнительных аргументов) должна быть соответствующая форма delete (c тем же набором дополнительных аргументов).

Вопрос был в том, как её правильно прописать (чтоб предупреждение убралось).

А что не понятно? Форма записи - так сказано - такие же аргуметны, как у new, только вместо первого size_t (у new) должен быть void* (удаляемый указатель). Внутри (в твоем случае) может ничего не делать. А просто для "убрать предупреждение" достаточно #pragma - т.к. (в твоем случае) никакой утечки памяти произойти не может...
Добавлено @ 12:09
Цитата(Hose @ 11.4.2006, 16:36 Найти цитируемый пост)
P.S. для общего развития - чем плох switch на 10 вариантов?

В первую очередь, плохо-читабельность и плохо-сопровождаемость.
Даже если на каждый case будет просто вызов функции, этот switch уже плохо-обозрим. И почему бы его сразу не заменить на явную таблицу функций?

Автор: takedo 13.4.2006, 12:39
Цитата

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

Вот и я не смог удеражться smile от высказываний.
Ignat, - тебе просто не повезло, а что касается 14тыс строк - а так ли это много? Это всего лишь 280 страниц в стреднем. И обижаться на программиста нет смысла, так как сейчас действительно программистов используют "в темную", ставя не реальные сроки и не раскрывая того, что требуется. Вообще-то говоря путь есть, он прописан все в тех же ГОСТах, а именно, надо сформировать пакет следующих документов(примерный пакет):
1) технические требования
2) провести дополнительные исследования по результатам которых сформировать техническое задание
3) по техническому заданию сформировать план - график работ

И проблем не будет! Но! Попробуй объясни заказчику, что именно так и только так он будет знать конкретные сроки(хотя они сразу же и возрастут, так как по тех заданию можно составить реалистичный, а не оптимистичный план).
А тот программист в чём то прав. Сейчас его нет и без него программа не получает дальнейшего правильного развития. Я так понимаю, что на его коде основана база проекта, а вот на эту базу ты делаешь "довески". и деньги сейчас получаешь именно ты smile . А тот кто делал базу отдыхает. Если спросишь его доволен ли он работой у твоих работодателей, что получишь в ответ? Да и вообще он может специально сидел пару недель и вычищал все комментарии smile
Я думаю, что вообще в наше время просто необходимо иметь программу, которая не только вычищат комментарии, но и переименовывает функции, например CreateBiilGates(int sex, int nationalnost) в Rl92384jk12324(int uioew89342kj,int sdf83sdf2087). Кстати, кто нибудь делал такую? smile

Автор: Ignat 13.4.2006, 13:57
Цитата(takedo @ 13.4.2006, 13:39 Найти цитируемый пост)
Кстати, кто нибудь делал такую?

Погугли на предмет обфускаторов. Много можно найти.

Автор: Earnest 13.4.2006, 15:30
Цитата(takedo @ 13.4.2006, 13:39 Найти цитируемый пост)
Я думаю, что вообще в наше время просто необходимо иметь программу, которая не только вычищат комментарии, но и переименовывает функции, например CreateBiilGates(int sex, int nationalnost) в Rl92384jk12324(int uioew89342kj,int sdf83sdf2087).

Вообще-то это прямой саботаж и обман работодателя. Сданная работа - это не только exe (возможно с документацией), но и приличный код. Уж во всяком случае без преднамеренной порчи. И не надо оправдывать эту пакость тем, что тебе мало платят - ищи, в конце концов, другую работу. Любая халтура - она тебя прежде всего портит.

Автор: UnrealMan 13.4.2006, 19:54
Цитата(Earnest @ 13.4.2006, 12:04)
А что не понятно? Форма записи - так сказано - такие же аргуметны, как у new, только вместо первого size_t (у new) должен быть void* (удаляемый указатель). Внутри (в твоем случае) может ничего не делать.

Уже давно пробовал – предупреждение не исчезает.

Цитата(Earnest @ 13.4.2006, 12:04)
А просто для "убрать предупреждение" достаточно #pragma

Да я в курсе, но, по-моему, такое «убирание» предупреждений не есть хороший стиль программирования.

Цитата(Earnest @ 13.4.2006, 12:04)
Цитата(Hose @ 11.4.2006, 16:36)
P.S. для общего развития - чем плох switch на 10 вариантов?

В первую очередь, плохо-читабельность и плохо-сопровождаемость.

Чем же это плохочитабельно? И какова предлагаемая альтернатива?

Автор: DeadSoul 13.4.2006, 22:41
Цитата(Earnest @ 13.4.2006, 15:30 Найти цитируемый пост)
Цитата(takedo @ 13.4.2006, 13:39 )
Я думаю, что вообще в наше время просто необходимо иметь программу, которая не только вычищат комментарии, но и переименовывает функции, например CreateBiilGates(int sex, int nationalnost) в Rl92384jk12324(int uioew89342kj,int sdf83sdf2087).
Вообще-то это прямой саботаж и обман работодателя.

За такое ты рискуешь получить "очень хорошие" рекомендации. Только солибной фирме ты так не сможешь нагадить. SVN\MS SS умеют выдергивать старые версии.
Добавлено @ 22:45
Цитата(UnrealMan @ 13.4.2006, 19:54 Найти цитируемый пост)
Цитата(Earnest @ 13.4.2006, 12:04)
Цитата(Hose @ 11.4.2006, 16:36)
P.S. для общего развития - чем плох switch на 10 вариантов?
В первую очередь, плохо-читабельность и плохо-сопровождаемость.
Чем же это плохочитабельно? И какова предлагаемая альтернатива?

Виртуальные функции. Пример(пишу прямо тут, поэтому не обессудьте):
Код

class Figure
{
public:
  enum FigureType{circle,square};

  Figure( FigureType  init):myType_(init){}
  ~Figure(){}

 void WriteType()
 {
   switch(myType_)
   {
     case circle: std::cout<<"Circle"<<std::endl; break;
     case square: std::cout<<"Square"<<std::endl; break;
   }
 }
private:
  FigureType myType_;
  
};

Добавлено @ 22:48
Далее, потребовалось добавить новый метод Draw. Код становится таким
Код

class Figure
{
public:
  enum FigureType{circle,square};

  Figure( FigureType  init):myType_(init){}
  ~Figure(){}

 void WriteType()
 {
   switch(myType_)
   {
     case circle: std::cout<<"Circle"<<std::endl; break;
     case square: std::cout<<"Square"<<std::endl; break;
   }
 }

 void WriteType()
 {
   switch(myType_)
   {
     case circle: DrawCircle(); break;
     case square: DrawSquare(); break;
   }
}
private:
  FigureType myType_;
  
};

Добавлено @ 22:51
Видишь switch-и плодятся! А теперь добавь еще один тип фигуры - треугольник. Во скольких местах тебе необходимо править код? Уже в двух, причем в реальном коде эти два(а ты уверен, что два? Ты все switch-и нашел? smile ) метода могут быть не рядом в одном файле, а в разных файлах\библиотеках

Автор: Earnest 14.4.2006, 08:15
Цитата(UnrealMan @ 13.4.2006, 20:54 Найти цитируемый пост)
Чем же это плохочитабельно? И какова предлагаемая альтернатива?

Насчет альтернативы и сопровождаемости DeadSoul уже написал. А плохо-читаемость из-за плохо-обозримости. "Хорошая" функция должна занимать не более пол-страницы, чтобы с одного взгляда можно было понять, что она делает. И делать она должна что-то одно. Мне же приходилось видеть функции со switch'ами страниц на 20. Вот счастье-то, когда что-то поправить нужно. Сразу чувствуешь себя ассенизатором: надеваешь прищепку на нос, рукавицы по локоть и ныряешь в это. smile Мне лично в таких случаях сразу хочется кого-нибудь убить.

Автор: takedo 20.4.2006, 14:10
Цитата

Вообще-то это прямой саботаж и обман работодателя. Сданная работа - это не только exe (возможно с документацией), но и приличный код. Уж во всяком случае без преднамеренной порчи. И не надо оправдывать эту пакость тем, что тебе мало платят - ищи, в конце концов, другую работу. Любая халтура - она тебя прежде всего портит. 

Цитата

За такое ты рискуешь получить "очень хорошие" рекомендации. Только солибной фирме ты так не сможешь нагадить. SVN\MS SS умеют выдергивать старые версии.

Оно все верно, когда вы изначально обговорили вопросы об авторсте. Плюс если вы сразу же знали, что от вас требовалось, а когда работа выполняется без четкого задания и вы за нее принимались, точно будучи уверенными, что пишете самокат, а в итоге от вас потребовалось написать аэрокосмичесую станцию, то... Вообщем, не очень хочется отдавать исходники, вот после того как зарегистрировать права, - можно, но и то только если очень попросят или об этом сразу была договоренность smile

Добавлено @ 14:14 
Цитата

За такое ты рискуешь получить "очень хорошие" рекомендации.
 - главное, чтобы глюков не было  smile , надёжность - главное! 

Автор: DeadSoul 20.4.2006, 22:35
Цитата(takedo @  20.4.2006,  14:10 Найти цитируемый пост)
Цитата
За такое ты рискуешь получить "очень хорошие" рекомендации.
 - главное, чтобы глюков не было   , надёжность - главное!  

Как ты думаешь насколько сложно получить контракт человеку, пишущему прекрасный код, но имеющему отвратные рекомендации?! 

Автор: takedo 24.4.2006, 07:13
DeadSoul, да думаю, что даже полегче будет, чем тому, кто имеет великолепные рекомендации, но продукты которого периодически глючат. 

Автор: Earnest 24.4.2006, 08:15
Цитата(takedo @  24.4.2006,  08:13 Найти цитируемый пост)
DeadSoul, да думаю, что даже полегче будет, чем тому, кто имеет великолепные рекомендации, но продукты которого периодически глючат.  

Ты очень здорово ошибаешься.
Работодателю более важна надежность и порядочность сотрудника (другими словами - лояльность), чем его программисские таланты. Конечно, полный лох никому не нужен. Но и самый разотличный программист, если он может выкинуть какой-нибудь фортель в описываемом духе - тоже.

 

Автор: Ignat 24.4.2006, 09:57
Цитата(Earnest @  24.4.2006,  09:15 Найти цитируемый пост)
Конечно, полный лох никому не нужен.

Ну если он опытный программист, то еще лучше =)))


А по теме: найти хорошее место работы при хороших проф. качествах и кол-ве смены рабочих мест, превышающих 7 в течение пяти лет, представляется сомнительным. 

Автор: DeadSoul 24.4.2006, 10:02
Цитата(Ignat @  24.4.2006,  09:57 Найти цитируемый пост)
А по теме: найти хорошее место работы при хороших проф. качествах и кол-ве смены рабочих мест, превышающих 7 в течение пяти лет, представляется сомнительным.  

Таких людей называют "Летуны" 

Автор: takedo 24.4.2006, 10:59
Цитата
Работодателю более важна надежность и порядочность сотрудника (другими словами - лояльность), 
 и тогда то вот работодатель и заключает договор или контракт, в котором всё обговорено, а если контракта на бумаге нет, и ты понимаешь, что начиная писать, как я и говорил ранее "самокат", в итоге пишешь уже аэрокосмолет, то в таких фертелях ничего зазорного на мой взгляд нет. Да, платят то вот как за самокат smile  Но думаю, что про это хватит. Просто сотрудник должен не чувствовать себя обманутым, а лучше защищённым и довольным, тогда этого не будет. А про хорошие качества мои как программиста ничего сказать большего, чем в подписи не могу. Лично я могу выезжать лишь за счёт общей культуры проектирования(и то это моя субъективная оценка самого себя smile ) 

Автор: Xenon 28.5.2006, 13:50
Может и глупый вопрос, но я тут заметил, что, в основном, люди здесь, вместо того, чтобы преодпределить область имен using namespace std, просто постоянно делают разрешение видимости, типа std::cout и т.д.
Это такой стиль (у Страуструпа в книге такой), или же в этом есть какой-то определенный смысл? 

Автор: DeadSoul 28.5.2006, 14:34
Цитата(XenonSk @  28.5.2006,  13:50 Найти цитируемый пост)
Это такой стиль (у Страуструпа в книге такой), или же в этом есть какой-то определенный смысл?  

Смысл - не вносить идентификаторы из пространства имен std в глобальное пространство имен 

Автор: Earnest 29.5.2006, 11:06
Дополню:  "using namespace x" может привести к кофликту имен: допустим в твоем контексте есть имя Y. Неважно, откуда оно взялось: это может быть локальный символ или нечто из другого пространства имен (введенное директивой using). Если в пространстве имен x тоже определено имя Y, то каждый раз при использовании Y в нашем контексте будем получать стоны компилятора о неоднозначности.

Поэтому общий принцип такой: в заголовочных файлах вообще стараемся избегать директив using (даже using "конкретный символ", using namespace же запрещаем под страхом смерти). Чем шире используется заголовочных файл, тем сильнее избегаем.
Внутри cpp-файлов и тем более внутри функций - вполне допустимо, можно поступать так как в данном контексте удобно.  

Автор: Alca 22.10.2006, 13:26
Кто-то грозился книгу выслать... [email protected].  Сп.

Автор: Ignat 23.10.2006, 09:58
Цитата(Alca @  22.10.2006,  14:26 Найти цитируемый пост)
Кто-то грозился книгу выслать... [email protected].  Сп. 

Ткните пальцем в тот пост. В противном случае, ваше сообщение - оффтоп.

Автор: v2v 14.11.2006, 20:31
http://forum.vingrad.ru/topic-87958/0.html#   -    фот: Дата 21.3.2006, 13:19. UnixBeginner
 Я бы тоже хотел эту книгу:  "formail1 @ gala.net" (без пробелов)

Автор: Аленка 14.11.2006, 23:38
Нас в институте учат сокращать код с if, else например, вот так-

Код

int i=6;
int j=1;
void main()

    if ((i == 1) || (j == 1))
    {
        i++;
        j++;
    }
    else
    {
        i--;
        j--;
    }

}    


до
 
Код

int i=6;
int j=1;
void main()
{
    (i == 1) ||(j == 1) ? (i++, j++) : (i--, j--);
}



Интересно, речь случайно не об этой  http://www.books.ru/shop/books/314291?

Автор: v2v 22.11.2006, 16:29
Цитата(Аленка @ 14.11.2006,  23:38)
Интересно, речь случайно не об этой  http://www.books.ru/shop/books/314291?

Возможно и об этой... интересно было бы почитать что-либо о стандартах программирования.. в частности на с++.

Автор: bsa 22.11.2006, 16:36
Цитата(Аленка @ 14.11.2006,  23:38)
Нас в институте учат сокращать код с if, else например, вот так-
Код
int i=6;
int j=1;
void main()
{
    (i == 1) ||(j == 1) ? (i++, j++) : (i--, j--);
}


Интересно, речь случайно не об этой  http://www.books.ru/shop/books/314291?

Я б убил за это... Читать потом невозможно, а стандарты форматирования существуют не для компилятора, а для человека. Пиши лучше так:
Код
int i=6;
int j=1;
main()

    if ((i == 1) || (j == 1)) {
        ++i;
        ++j;
    } else {
        --i;
        --j;
    }
}

Автор: Xenon 22.11.2006, 17:44
bsa, а я за перенос скобок бы убил smile 

Автор: bsa 23.11.2006, 13:52
Цитата(Xenon @ 22.11.2006,  17:44)
bsa, а я за перенос скобок бы убил smile

Ты имеешь в виду перенос открывающей скобки на строчку оператора? Дело вкуса  smile 

Автор: Xenon 29.11.2006, 19:45
bsa, да, но я этого жутко не люблю - потому что нельзя пробежаться глазами вертикально вниз от одной скобки к другой, чтобы найти конец и начало блока быстро. Приходится читать код smile А так можно было бы машинально. На мой взгляд такой стиль - экономия места, а без переноса - читабельность

Автор: nickless 29.11.2006, 23:40
Не надо писать вот так (перл новичка в С++, раньше писавшего на яве):
Код
MyClass blah = *(new MyClass());

Автор: Uch3nik 30.11.2006, 20:03
Подскажите пожалуйста! Как получить доступ к данным в строках "ComboBox". Цикл такой: 
Код

for (i=0; ComboBox->Items->Count; i++)
  {
     Label->Caption = ComboBox->Items->Strings[i];               <- Вот это меня и интересует!
  }


Заранее спасибо.

Автор: Poltergeyst 2.12.2006, 05:45
Привет всем умным и знающим я тут с таким вапросам как мне научится рязыку С++ ? дайте какие нибуть прожки несерьёзные плиз 

Автор: champion 2.12.2006, 07:27
Начни с указателей, они пригодятся тебе: http://forum.vingrad.ru/topic-60932.html
А так советую, купи книжку Страуструпа, третье издание, специальное. Хорошая книга.

Автор: GrayCardinal 2.12.2006, 08:17
Цитата

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

Народ, да вы чего ? K&R рулит  smile 
Кто-нибудь пытался прочитать код Vim ?! Не знаю, лично для меня даже libaal и kernel/sched.c проще читать.
Там это, когда переносят скобку на следующую строку - не видно к какому оператору скобка да плюс читаете _две_ строчки вместо одной. А блоки (в нормальном коде) тупо по отступам видно.

Насчет глобальных переменных. Ну и чего плохого в том, что будет глобальная структура со всеми настройками проги ? Лучше разбить на десяток объектов со своими свойствами, каждый из которых отвечает за свою функциональность ? А потом х.з. где у тебя "глубина дерева"................. Нет, _я_ конечно, найду... Тем же "бобиком", но................. Зачем ВЕЗДЕ И ВСЯ пихать классы ?! Хорошо научили что-ли, надо пользовать ?

Насчет классов. Лично меня убивает когда прогу начинают с класса... В смысле CSpace (типа - космос), а потом вниз до функции "найти символ". (где моя "муха" ?! )

<Ы>
Встречал разное... В том же Vim (наболело smile ) дофига и больше макросов и #ifdef'ов (проверяющих архитектуру !). Полное отсутствие документации (по коду) или хотябы описания структуры или еще чего-нить (!).

А я бы убивал тех, кто пишет на Haskell или "D", чесслово ! Вот тока винтовку достану  smile 

Автор: Poltergeyst 2.12.2006, 08:35
Cасибо вы мне немногопомогли   Ищу хорошего програмиста 

Автор: Daevaorn 2.12.2006, 12:26
GrayCardinal, у всех свой взгляд на проблему и свои привычки.

Автор: V.A.KeRneL 10.12.2006, 05:06
Цитата(GrayCardinal @ 2.12.2006,  08:17)
А я бы убивал тех, кто пишет на Haskell или "D", чесслово !

От зависти что ли? smile

Автор: zabivator 11.12.2006, 01:49
V_A_KeRneL, я подозреваю, что после этих языков народ пишет на плюсах через одно место. Хаскель я очень уважаю, если что =)

Автор: V.A.KeRneL 11.12.2006, 04:36
Цитата(zabivator @  11.12.2006, 01:49 Найти цитируемый пост)

я подозреваю, что после этих языков народ пишет на плюсах через одно место.

Согласен, такие языки как Haskell хороши в качестве последних! После них уже не охота разбираться ни то что с какими-нибудь указателями, а вообще с тем, что должна ДЕЛАТЬ программа (механически). Главное понять задачу, а потом просто перевести задание на язык Хашкеля. Всё! Как прога будет добиваться нужного результата -- её дело; не маленькая; программисту над этим париться не хоцца!..))
Насчёт D ничиго не знаю, посему ничиго и не скажу.

Цитата(zabivator @  11.12.2006, 01:49 Найти цитируемый пост)

Хаскель я очень уважаю, если что =)

ОК! =)

З.Ы. Haskell я буду изучать примерно через год, после C++. smile
З.З.Ы. Но уже руки чешутся!.. И нет-нет, да и залезут в книжечку.))

Автор: Xenon 28.12.2006, 18:57
А если я, допустим, из своего класса вызываю некую внешнюю функцию (strcpy() например), я должен разрешать видимость и указывать на то,  что функция из внешнего пространства имен вызывается (::strcpy())?Компилируется-то в любом случае - и когда класс помещен в какое-то стороннее пространство имен и когда нет ...

Автор: bsa 30.12.2006, 15:58
Думаю, лучше указывать. Легче будет понять, что ты имел в виду.

Автор: FelikZ 4.3.2007, 00:39
Как вам такое:
Код

typedef int THIS_IS_MY_INT;
#define TIMT THIS_IS_MY_INT
#define MY_CLASS_VALUE TIMT
//разумеется слова в дефайнах не такие, но сам смысл

Неужели тяжело написать просто 'int', нет нужно писать такую чушь(очень часто в опен сурсах вижу).
Вот за это Я бы убил! smile 

Автор: Daevaorn 4.3.2007, 00:51
Цитата(FelikZ @  4.3.2007,  01:39 Найти цитируемый пост)
Неужели тяжело написать просто 'int', нет нужно писать такую чушь(очень часто в опен сурсах вижу).
Вот за это Я бы убил! 

раз это пишут, значит это нужно. Сегодня я использую int, а завтра захочу float, и что всё переписывать? Нет, я заменю всего один(!) дефайн или тайпдеф.

Автор: FelikZ 4.3.2007, 14:47
Цитата(Daevaorn @  4.3.2007,  00:51 Найти цитируемый пост)
раз это пишут, значит это нужно. Сегодня я использую int, а завтра захочу float, и что всё переписывать? Нет, я заменю всего один(!) дефайн или тайпдеф.

Возможно ты и прав, но о какой красоте кода здесь можно говорить? Если на это посмотрит человек, не знающий о проекте ничего, но который хочет разобраться в нем?
Он просто офигеет лазить по файлам(если проект огромный) и искать какой из дефайнов что означает...

Автор: Daevaorn 4.3.2007, 14:52
Цитата(FelikZ @  4.3.2007,  15:47 Найти цитируемый пост)
но о какой красоте кода здесь можно говорить?

за красоту не платят
Цитата(FelikZ @  4.3.2007,  15:47 Найти цитируемый пост)
но который хочет разобраться в нем?

если хочет, то разберется и так
Цитата(FelikZ @  4.3.2007,  15:47 Найти цитируемый пост)
Он просто офигеет лазить по файлам(если проект огромный) и искать какой из дефайнов что означает... 

надо просто нормальные имена давать в таких случаях, чтобы из-за них и контекста было понятно что это.

Автор: FelikZ 4.3.2007, 15:20
Цитата(Daevaorn @  4.3.2007,  14:52 Найти цитируемый пост)
за красоту не платят

не факт, на некоторых работах за это платят.(напр. экстремальное програмирование)

Автор: Daevaorn 4.3.2007, 15:40
Цитата(FelikZ @  4.3.2007,  16:20 Найти цитируемый пост)
не факт, на некоторых работах за это платят.(напр. экстремальное програмирование) 

спорно, но ладно, переформулирую: платят гораздо меньше чем за скорость разработки и качество

Автор: FelikZ 4.3.2007, 16:23
Цитата(Daevaorn @  4.3.2007,  15:40 Найти цитируемый пост)
спорно, но ладно, переформулирую: платят гораздо меньше чем за скорость разработки и качество

Тут без сомнений  smile 

Автор: popovda 23.5.2007, 16:36
Это все еще х-ня, господа. Вот я в НИИАП (нынче ФГУП Научно-производственный центр автоматики и приборостроения им. Н.А. Пилюгина), в 01 отделении работал, так там как есть из 77-го Фортрана на C++ Builder переписали. Как есть. С метками, с вычисляемым go to. Причем сами писали эмулятор этого вычисляемого go to. И switch на 30-40 единиц, и другие приколы. Я повеситься захотел, но потом просто сбежал. Ведь требуют - ты пиши так же. А я привык стандарту следовать.... И вообще непонятно, не проще ли было взять какой-нибудь Fortran Power Station 4 и на нем компилить. Или на современном Фортране написать. Бред... Теперь понятно почему у нас ракеты плохо летают. Американцам даже ПРО ненужно. Достаточно всего лишь еще какой-нибудь язык раскрутить, чтобы он тоже модным стал и загнать его нашим идиотам-чиновникам от науки и промышленности.

P.S. Switch был не для отправки меssage, в нем до 500 строк в каждом (!) блоке.... Из них 300 дублируются.

Автор: JackYF 25.5.2007, 21:04
Цитата(popovda @  23.5.2007,  16:36 Найти цитируемый пост)
И вообще непонятно, не проще ли было взять какой-нибудь Fortran Power Station 4 и на нем компилить.

Хы, это точно.

P.S. Да что это у меня оффтоп пошел...

Автор: qweasd 12.9.2007, 12:19
Сорри

Автор: EugenOS 21.11.2007, 23:12
Цитата

так там как есть из 77-го Фортрана на C++ Builder переписали. Как есть. С метками, с вычисляемым go to. Причем сами писали эмулятор этого вычисляемого go to.



В 99.9999% случаев я с тобой полностью согласен, даже больше чем просто согласен. Но, недавно разбирался с одним девайсом, и там функция на подобие MD5, занимала половину ПЗУ контроллера, а вся работа девайса крутилась вокруг нее. Чтобы все это понять, переписал функцию на C++Builder, запускаю  - результат не совпадает. Искал, искал нашел несколько возможных ошибок, повторюсь именно возможных. результат не совпадает. Эмуляторов на мотороловские контроллеры нормальных нет (потом откопал ZAS05) потому что они аппаратные производят. переписал функцию уже заменяя все на асм. результат изменился, но не совпадает. И все вроде правильно(переводил уже построчно) не тот результат хоть ты тресни. Потом откопал таки этот эмулятор(заставить его работать со своим бинарным файлом, это еще та проблема, к слову) и нашел в чем причина. На  мотороле операции присвоения, сравнения, декремента и т.п. трогали гораздо меньше флагов
чем в x86, понавставлял в циклах push/pop-ов и все заработало. Вот теперь и имею, нормально написанную программу( с кучей функций и интерфейсом и т.п.) и один файл в котором голимый асм а в комментариях асм 68HC05. И честно признаюсь - рефакторить это я не буду, ни за какие коврижки. Как говорилось в анекдодоте:

- Папа, а почему каждое утро солнце встает на востоке, а вечером садится на западе?
- Ты уверен?
- Да
- Точно работает? Без сбоев?
- Да...
- Слушай сынок, никогда, ни за что не трогай, не дай бог сломается, потом работать не заставишь.

Автор: nickless 21.11.2007, 23:48
Код
class Vec3f
{
public:
  float x,y,z;

  Vec3f()
  {};
  Vec3f(float x,float y, float z)
    : x(x),y(y),z(z)
  {};
  Vec3f(float f)
    : x(f),y(f),z(f)
  {};

  inline const float &operator[](const int i) const
  { return *(&x+i); };

  inline float &operator[](const int i)
  { return *(&x+i); }; //((float *)(this))[i]; };

  inline int MaxDim() const
  {
    return (x > y)?((x > z)?0:2):((y > z)?1:2);
  }
};

// заметьте, класс кончился !!!

  /*! dot product */
inline float Dot(const Vec3f &a, const Vec3f &b)
{ return a.x*b.x+a.y*b.y+a.z*b.z; };

// еще 18 глобальных функций

Как говорится орфография и пунктуация аффтара сохранены smile 

Автор: Helcar 1.12.2007, 05:33
Если код оформлен читаемо то и рабираться в нём легче. По поводу swtch`ей - в некоторых случаях без них не обойтись (пример программа под чистый WinAPI), так что, если оно работает то и плохо оформлено, то оформление можно немного поправить. Главное что бы поле надстройки оно так же хорошо работало как и без нее. 

Кроме того лично видел несколько реализаций в которых использовалось goto, да там можно без этого обойтись, просто по моему  стоит помнить и о оптимизации кода, по быстро действию втом числе.

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

Автор: CppDevelopeR 28.3.2008, 13:12
Пару лет назад, еще начинал программировать написал так:
Код

   int MAX = 50000, i, arr[MAX];


переделал на(ваще обаржаца smile ) 

Код

     int MAX,i;
     cin >> MAX;
     int arr[MAX];


Хотя мой препод сказал, что второй код работает на некоторых компиляторах.

Долго не мог сообразить. Мы все конечно знаем что писать можна так:
Код

     const int MAX = 10000
     int arr[MAX], i;


или:
Код

#define MAX 30000
             //. . . Че-то там еще, если надо
 int arr[MAX], i;


З.Ы. Переменная i  использовалась просто так, для наглядности!

Автор: deninok 28.3.2008, 13:16
Вообще, не рекомендуется использовать в одной строке более одного действия (за редчайшими исключениями).
То есть код
Код

int i, j, k = 2, g;

лучше переписать так:
Код

int i;
int j;
int k = 2;
int g;


Автор: CppDevelopeR 28.3.2008, 18:23
Согласен! )))
Но всетаки у всех есть вредные привычки. Давно бы надо от нее отделаться. smile 

Автор: 0lmer 9.4.2008, 16:36
Недвно видел такое smile


//считаем согласные буквы.
#include <stdio.h>
#include <string.h>
void main()
{    int i=0; //количество символов.
     int s=0;// колличество согласных букв.
    char C=0;
    printf("vedite predlojenie:\n");
     scanf("%s", strlen);
     for(int i=0;i!=0; i=i++);
     printf("kolichestvo simvolov v stroke %d",i);
     if (C='Ц','К','Н','Г','Ш','Щ','З','Х','Ф','В','П','Р','Л','Д','Ж','Ч','С','М','Т','Б');
     printf("kolichestvo soglasnyh bukv %s",s);
      system("PAUSE");
      return;
}





Автор: kosmonaFFFt 16.4.2008, 11:38
Недавно видел такое:

Код

//считаем согласные буквы.
#include <stdio.h>
#include <string.h>
void main()
{    int i=0; //количество символов.
     int s=0;// колличество согласных букв.
    char C=0;
    printf("vedite predlojenie:\n");
     scanf("%s", strlen);
     for(int i=0;i!=0; i=i++);
     printf("kolichestvo simvolov v stroke %d",i);
     if (C='Ц','К','Н','Г','Ш','Щ','З','Х','Ф','В','П','Р','Л','Д','Ж','Ч','С','М','Т','Б');
     printf("kolichestvo soglasnyh bukv %s",s);
      system("PAUSE");
      return;
}


Долго ржал когда мне скинули СКРИНШОТ этого кода в билдере и попросили посмотреть где ошибка.

Автор: Rocksteady 19.4.2008, 23:43
У нас чувак на работе запросто пишет такой код:
Код

TSomeClass* someObject = dynamic_cast<TSomeClass*>((TSomeClass*)someOtherObject);


Типа сначала "изнасиловали" объект явным приведением, а потом еще "вот тебе, маленький, аккуратный динамик_каст" ("хотя он тебе уже мало чем поможет")...

Автор: Earnest 21.4.2008, 15:35
Цитата(Rocksteady @  20.4.2008,  00:43 Найти цитируемый пост)
хотя он тебе уже мало чем поможет

Да нормально сработает: если компилятор приведение видит, нормально сработает уже c-приведение, а dynamic cast - просто лишний. Если же компилятор не знает как привести (первое), то адрес не изменится, а тут как раз dynamic_cast подскочит.
Хотя код конечно дурной: устройте ему темную, что ли, если начальству все равно.

Автор: UnrealMan 23.4.2008, 00:47
Цитата(Earnest @  21.4.2008,  15:35 Найти цитируемый пост)
Да нормально сработает

Не факт. Совсем не факт.

Цитата(Earnest @  21.4.2008,  15:35 Найти цитируемый пост)
если компилятор приведение видит, нормально сработает уже c-приведение, а dynamic cast - просто лишний. Если же компилятор не знает как привести (первое), то адрес не изменится, а тут как раз dynamic_cast подскочит.

smile
Вот рассуждениями примерно такого уровня руководствуются авторы подобного кода.

Автор: Earnest 23.4.2008, 08:20
Цитата(UnrealMan @  23.4.2008,  01:47 Найти цитируемый пост)
Не факт. Совсем не факт.

Это нужно обосновать.
Цитата(UnrealMan @  23.4.2008,  01:47 Найти цитируемый пост)
Вот рассуждениями примерно такого уровня руководствуются авторы подобного кода. 

Правильная работа - не единственный критерий хорошего кода, и даже не самый главный.

Автор: UnrealMan 23.4.2008, 13:10
Цитата(Earnest @  23.4.2008,  08:20 Найти цитируемый пост)
Это нужно обосновать.

Обосновать как раз нужно было обратное. Стандарт не даёт никаких гарантий правильности работы этого кода применительно к общему случаю. Но если стандарты для вас не писаны, то тогда просьба показать компилятор, который скомпилирует вот это

Код

struct B { virtual ~B() {} };
struct D : virtual B {};

int main()
{
    D d;
    B *pb = &d;
    D *pd = (D *)pb;
}

и который здесь

Код

struct B1 { virtual ~B1() {} };
struct B2 { virtual ~B2() {} };
struct D : B1, B2 { int n; };

int main()
{
    D d;
    d.n = 123;
    B1 *pb1 = &d;
    B2 *pb2_right = dynamic_cast<B2 *>(pb1);
    std::cout << static_cast<D *>(pb2_right)->n << std::endl;
    B2 *pb2_wrong = dynamic_cast<B2 *>((B2 *)pb1);
    std::cout << static_cast<D *>(pb2_wrong)->n << std::endl;
}

в обоих случаях сделает вывод числа 123.

Автор: Earnest 23.4.2008, 16:47
Ну уел, уел, с виртуальным наследованием все сложнее, только чего так напрягаться-то, мог бы и поспокойнее написать. smile 

Автор: mastaflow 3.5.2008, 17:58
сегодня пронаблюдал такой код (под бс3.1)
Код
    int gdriver=DETECT,mode,errorcode,n,speed,dx,xn,xk,yn,yk,run,paint,flag[10],lxn;
    int color[3]={2,4,14},column[10]={204,227,250,273,296,319,342,365,388,411},i,j,kub,green[10],red[10],yellow[10],quit;

далее очень интересная функция:
Код
void repaint(int *flag,int *green,int *red,int *yellow,int i,int yn,int yk,int xn,long *score,int kub)
  {
    (*flag)++;
    if(i==0){ (*green)++;  *red=0;   *yellow=0;  }
    if(i==1){  *green=0;  (*red)++;  *yellow=0;  }
    if(i==2){  *green=0;   *red=0;  (*yellow)++; }
    if(*green==kub)
      {
    (*score)+=10;
    remove(&(*flag),*green,yn,yk,xn);
    *green=0;
    print_score(*score,1);
      }
    if(*red==kub)
      {
    (*score)+=10;
    remove(&(*flag),*red,yn,yk,xn);
    *red=0;
    print_score(*score,1);
      }
    if(*yellow==kub)
      {
    (*score)+=10;
    remove(&(*flag),*yellow,yn,yk,xn);
    *yellow=0;
    print_score(*score,1);
      }
  }

Особенно мне понравилась идея &(*flag)

Автор: kosmonaFFFt 3.5.2008, 18:18
Цитата(mastaflow @  3.5.2008,  17:58 Найти цитируемый пост)
Особенно мне понравилась идея &(*flag)

Тоже один раз подобное видел. smile

Или вот еще недавно наблюдал код примерно такого содержания:

Код

class Boo {
public:
    //Тут методы.
private:
    //Тут данные в виде:
    int a = 10;
    HANDLE Heap = GetProcessHeap();
    //И так далее
};


Автор: Lycifer 7.7.2008, 13:16
kosmonaFFFt - вопрос такой:

Цитата

class Boo {
public:
    //Тут методы.
private:
    //Тут данные в виде:
    int a = 10;
    HANDLE Heap = GetProcessHeap();
    //И так далее
};


Как это скампилируеются  smile ?     HANDLE Heap = GetProcessHeap(); переменная должнать быть статической . И вправду такой код пугает  smile 

Автор: kosmonaFFFt 7.7.2008, 16:45
Цитата(Lycifer @  7.7.2008,  13:16 Найти цитируемый пост)
kosmonaFFFt - вопрос такой:Цитатаclass Boo {public:    //Тут методы.private:    //Тут данные в виде:    int a = 10;    HANDLE Heap = GetProcessHeap();    //И так далее};Как это скампилируеются   ?     HANDLE Heap = GetProcessHeap(); переменная должнать быть статической . И вправду такой код пугает   


как это компиллировалось не видел smile но в комплекте с исходником и просьбой "найти ошибку"
был приложен экзешник, который умел только дико глючить.

Автор: Ulysses4j 7.7.2008, 18:22
Цитата(mastaflow @ 3.5.2008,  17:58)
Особенно мне понравилась идея &(*flag)

Кстати, вполне нормаьлный мог бы быть код, если бы flag был итератором.

Автор: Torsten 13.7.2008, 12:01
Аленка
Цитата(Аленка @  14.11.2006,  23:38 Найти цитируемый пост)
Нас в институте учат сокращать код с if, else например, вот так
Код
int i=6;
int j=1;
void main()

    if ((i == 1) || (j == 1))
    {
        i++;
        j++;
    }
    else
    {
        i--;
        j--;
    }

}    

до 
Код

int i=6;
int j=1;
void main()
{
    (i == 1) ||(j == 1) ? (i++, j++) : (i--, j--);
}



Тернарный оператор должен иметь только одно условие, иначе он плохо читается. В данном случае одна из лучших записей такого кода, будет выглдядеть вот так :
Код

iint i=6;
int j=1;
void main()

    if ((i == 1) || (j == 1))
        i++, j++;
    else
        i--,  j--;
}   

GrayCardinal
Цитата(GrayCardinal @  2.12.2006,  08:17 Найти цитируемый пост)
Насчет глобальных переменных. Ну и чего плохого в том, что будет глобальная структура со всеми настройками проги ? Лучше разбить на десяток объектов со своими свойствами, каждый из которых отвечает за свою функциональность ? А потом х.з. где у тебя "глубина дерева"................. Нет, _я_ конечно, найду... Тем же "бобиком", но................. Зачем ВЕЗДЕ И ВСЯ пихать классы ?! Хорошо научили что-ли, надо пользовать ?

Глобальный переменные использовать в С++ нельзя, это признак непрофиссиональность. Хранить настройки проги нужно в классе сингтоне. Классы везде пихать не нужно. Если функция не имеет отношения к классу ее нужно вынести отдельно с собственным пространством имен (namespace).

FelikZ

Цитата(FelikZ @  4.3.2007,  00:39 Найти цитируемый пост)
Как вам такое :
Код
typedef int THIS_IS_MY_INT;
#define TIMT THIS_IS_MY_INT
#define MY_CLASS_VALUE TIMT
//разумеется слова в дефайнах не такие, но сам смысл

 


В дефайнах - неправильно. В typedef - правильно. Подробнее об этом в книгах написано.

Цитата(FelikZ @  4.3.2007,  14:47 Найти цитируемый пост)
Он просто офигеет лазить по файлам(если проект огромный) и искать какой из дефайнов что означает...

Для этого и нужны IDE, там достаточно нажать один раз хоткей чтобы перенестись к месту обьявляния. Ну а самые продвинутые, так вообще специальных textEdit могут показывать это (в VS вверху он находится по умолчанию над редактором), нужно лишь курсор на тип поместить чтобы увидеть как он определен.


Автор: Kallikanzarid 12.11.2008, 10:07
Цитата

а как же map<ErrorID, string> и exception::what()?


Лучше тогда уж error<id>::message, если конечно нет необходимости регистрировать ошибки в рантайме.

Автор: Kallikanzarid 12.11.2008, 10:46
Цитата(nickless @ 21.11.2007,  23:48)
Код
class Vec3f
{
public:
  float x,y,z;

  Vec3f()
  {};
  Vec3f(float x,float y, float z)
    : x(x),y(y),z(z)
  {};
  Vec3f(float f)
    : x(f),y(f),z(f)
  {};

  inline const float &operator[](const int i) const
  { return *(&x+i); };

  inline float &operator[](const int i)
  { return *(&x+i); }; //((float *)(this))[i]; };

  inline int MaxDim() const
  {
    return (x > y)?((x > z)?0:2):((y > z)?1:2);
  }
};

// заметьте, класс кончился !!!

  /*! dot product */
inline float Dot(const Vec3f &a, const Vec3f &b)
{ return a.x*b.x+a.y*b.y+a.z*b.z; };

// еще 18 глобальных функций

Как говорится орфография и пунктуация аффтара сохранены smile

Вот он удивится при портировании на x64  smile 

Автор: bsa 12.11.2008, 13:55
Цитата(Kallikanzarid @ 12.11.2008,  10:46)
Вот он удивится при портировании на x64  smile

Ты выравнивание имел в виду?

Автор: Kallikanzarid 13.11.2008, 03:14
Цитата(bsa @ 12.11.2008,  13:55)
Цитата(Kallikanzarid @ 12.11.2008,  10:46)
Вот он удивится при портировании на x64  smile

Ты выравнивание имел в виду?

Сейчас проверил - видимо, я плохо знаю стандарт.
Код

#include <iostream>
using namespace std;

#pragma pack(push)
#pragma pack(8)

class test {
public:
    float a, b, c;
    test( float a_, float b_, float c_ ) : a(a_), b(b_), c(c_) {}
    float operator[]( size_t index ) { return (&a)[index]; }
};

int main() {
    test tst( 1.0f, 2.0f, 3.0f );
    cout << tst[0] << ' ' << tst[1] << ' ' << tst[2] << endl;
}

#pragma pack(pop)


Работает  smile 

Автор: nickless 14.11.2008, 18:43
Оно конечно работает (во всяком случае под 32 бит и gcc), но это не стандарт
Цитата

ISO/IEC 14882:2003
9.2 Class members

"Nonstatic data members of a (non-union) class declared without an intervening access-specifier
are allocated so that later members have higher addresses within a class object."

"Implementation alignment requirements might cause two adjacent members not to be allocated
immediately after each other
; ..."

Автор: Kallikanzarid 14.11.2008, 19:54
Это не противоречит коду выше. Скорее всего, компилятор просто учел выравнивание и преобразовал (&x)[index] к ((char*)&x) + 8*index). Хотя, конечно, не факт, что будет компилироваться везде.

Автор: Fire-Plug 19.1.2009, 08:32
Цитата(likehood @ 2.4.2006,  15:52)
Цитата(UnrealMan @  2.4.2006,  11:48 Найти цитируемый пост)
А как ты в builder'е пробовал-то вызывать конструктор? Так:
pointer->Class() или так:
pointer->Class::Class() ?

Да и так и эдак - Builder не знает метода Class().
В VC6 второй вызов работает как надо, можно даже не через указатель а напрямую.

Полагаю, что вы не совсем поняли, что он предложил, а именно - вызвать конструктор класса через его полностью квалифицированное имя (fully qualified name), 
т.е.  
Код

class Class
{
public:
    Class() { ... }
 . . .
};

pointer->Class::Class();

хотя ПМСМ - это мазохизм в тяжелой форме. 
В тех упражнениях, что он предлагает, этот подход ещё можно как-то использовать и воспринимать как курьёз.

В реальных ООП проектах - это просто бред голимый. 
Например, как он собиратеся вызывать деструктор по указателю на базовый полиморфный класс, т.е. виртуальную ф-цию? Каким макро он собиратеся это делать?

ООП - это не только класс/структура с конструктором/деструктором и new/delete vs calloc/malloc/free. Это - как раз именно наследование и полиморфизм.
Так что подход, предлагаемый UnrealMan, можно выразить слоганом: прощай ООП.

Советую не принимать близко к сердцу, т.к. ник товарища говорит о многом - ну не любит он общепринятых решений для стандартных ситуаций.
НО есть положительный момент - заставляет снова осмыслить рациональное зерно С++ и его принципиальные отличия от С - и не только в плане выделения памяти. В конце концов, имеется placement new оператор...

Автор: Fire-Plug 19.1.2009, 09:39
Цитата(Ignat @ 18.3.2006,  06:52)
Это не вопрос, а скорее крик души.
. . .

4. Собственно от чего я сегодня опупел - static-функции вне класса. Честно сознаюсь, никогда так не извращался, посему тот факт, что я её фиг увижу за пределами единицы трансляции поверг меня в уныние. Нэймспейсы, видимо, отменили специально для "аффтара". Для чего это вообще делалось, так и не понял.

. . .
Блин, по скромной оценке кода больше тысячи строк... Как дальше с этим работать просто загадка тысячелетия. Но если назвался груздем...

Были ли у вас такие подлянки? Как мне дальше разгребать?

Э-э-э-х, ваше счастье, уважаемый, - не видели вы гигантских С-шных проектов с файлами по 20+ тыс. строк кода и проектами к-либо из бизнес-компонент системы по 5,5 тыс. функций. Просто ф-ций; не методов; с тысячами callback-ф-ций - этим С-шным способом реализации полиморфного поведения... 
Лучше бы мои глаза их тоже не видели... Когда-то мне очень нравился этот язык, а теперь - ненавижу. Может даже не сам язык, а тех козлов - нынешних ветеранов-старперов и теперь уже почти сплошь директоров и менеджеров, кто за 15+ лет так не попытался мигрировать проект в ООП на С++, когда это еще было возможно. Теперь по неофициальной оценке code base превышает 6 млн. строк и нет ни возможности, ни ресурсов, ни самое главное - желания осуществить миграцию. Контора, плять, стабильная - неплохо платит и от дома 6,5 км... Пол-года маюсь и никак не решусь начать искать другую работу, чтобы о С не слышать больше вообще.

Ладно, эмоции в сторону. 
Объявление С-ф-ции(и/или переменной) в c/cpp-файле как static ограничивает ее область видимости рамками данного файла. Т.е. ниоткуда больше, как из данного файла, ф-ция не видна и, следовательно, не может быть вызвана, а переменная - не имеет доступа извне. При этом декларация ф-ции также находится в том же файле, а не в к-либо файле заголовка.
Идея - этакий вариант С-шной инкапсуляции. Наверное, в 1970 г. это была "плодотворная дебютная идея" (с).
Как видите - нет ничего общего со статическим методом/переменной-членом класса, кроме как самого модификатора static smile 

Автор: zim22 25.1.2009, 17:59
В книге С++ Primer рекомендуют избегать глубокого вложения условных выражений.
И приводят 2 примера кода для нахождения максимума из 3 значений.

1) Этот код не рекомендуют:
Код

int i = 10, j = 20, k = 30;
int max = i;
if (j > max) max = j;
if (k > max) max = k;

2) Пишут, что это значительно проще и наглядней:
Код

int max = i > j 
? i > k ? i : k 
: j > k ? j : k;

Вы тоже согласны с авторами? Лично мне кажется, что первый вариант наглядней...

Автор: mes 25.1.2009, 18:08
Цитата(zim22 @  25.1.2009,  16:59 Найти цитируемый пост)
рекомендуют избегать глубокого вложения условных выражений.


Цитата(zim22 @  25.1.2009,  16:59 Найти цитируемый пост)
Пишут, что это значительно проще и наглядней:

так как раз у второго кода вложение гораздо глубже )))

а третьего варианта там в пример не привели ?
Код

int max = std::max(std::max(i,j),k);

Автор: zim22 25.1.2009, 18:17
Цитата(mes @  25.1.2009,  18:08 Найти цитируемый пост)
а третьего примера не привели там ?
Код

int max = std::max(std::max(i,j),k);


о, отличный код! не привели, т.к. до stl не дошли ещё. 
до введения понятия итератор вектор проходили с помощью такого цикла:
Код

for (std::vector<int>::size_type index = 0; index != v.size(); ++index)

после введения итератора примеры в книге поменялись:
Код

for (std::vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)

Так что возможно когда до STL дойду, они исправятся и извинятся за некрасивый код smile

Автор: bsa 29.1.2009, 18:36
Цитата(zim22 @ 25.1.2009,  18:17)
не привели, т.к. до stl не дошли ещё. 
до введения понятия итератор вектор проходили с помощью такого цикла:
Код

for (std::vector<int>::size_type index = 0; index != v.size(); ++index)

после введения итератора примеры в книге поменялись:
Код

for (std::vector<int>::const_iterator ci = vi.begin(); ci != vi.end(); ++ci)

Так что возможно когда до STL дойду, они исправятся и извинятся за некрасивый код smile

Отлично. Вот только std::vector - это уже STL.

Автор: ДокторТуамОсес 10.6.2009, 16:17
Цитата(chipset @  18.3.2006,  07:09 Найти цитируемый пост)
switch на 10 вариантов.

А каким способом можно обойтись без свитча на большое кол-во вариантов?

Автор: just_geek 15.6.2009, 04:11
можно хэш ) в качестве значения указатель на функцию... но громоздко выйдет smile)

Автор: ДокторТуамОсес 15.6.2009, 10:00
Цитата(just_geek @  15.6.2009,  04:11 Найти цитируемый пост)
но громоздко выйдет

Вот и я про то же.
Чел ругает свитч со многими варианами, а своего, более краисвого и элегантного, решения не предлагает. И видимо его просто нет.

ИМХО, не вижу ничего не красивого в свитче со многими вариантами.
Всё очень читабельно и понятно

Автор: mes 19.6.2009, 19:51
Цитата(ДокторТуамОсес @  15.6.2009,  09:00 Найти цитируемый пост)
Чел ругает свитч со многими варианами, а своего, более краисвого и элегантного, решения не предлагает. И видимо его просто нет.

Чтоб предложить решение, нужно знать задачу. Для искоренения свитча есть несколько вариантов, хотя в принципе все они основаны на таблице функций.

Цитата(ДокторТуамОсес @  15.6.2009,  09:00 Найти цитируемый пост)
ИМХО, не вижу ничего не красивого в свитче со многими вариантами.
Всё очень читабельно и понятно 

Ну да.. если вся программа состоит из единственного свитча.  smile 

Автор: ДокторТуамОсес 19.6.2009, 23:32
Ругаете свитч на 10 вариантов?
Говорите что это "ужас", "кошмар"?

А как Вам это (то что я привёл ниже)?

Это очень читабельно?
Это не "ужас"?

Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0

Всем понятно что делает этот код?

Код


// Interface Smart Pointers:

_COM_SMARTPTR_TYPEDEF(FolderItem, __uuidof(FolderItem));
_COM_SMARTPTR_TYPEDEF(FolderItemVerb, __uuidof(FolderItemVerb));
_COM_SMARTPTR_TYPEDEF(FolderItemVerbs, __uuidof(FolderItemVerbs));
_COM_SMARTPTR_TYPEDEF(FolderItems, __uuidof(FolderItems));
_COM_SMARTPTR_TYPEDEF(IAccessible, __uuidof(IAccessible));
_COM_SMARTPTR_TYPEDEF(IActiveDesktop, __uuidof(IActiveDesktop));
_COM_SMARTPTR_TYPEDEF(IActiveScript, __uuidof(IActiveScript));
_COM_SMARTPTR_TYPEDEF(IActiveScriptError, __uuidof(IActiveScriptError));
_COM_SMARTPTR_TYPEDEF(IActiveScriptParse, __uuidof(IActiveScriptParse));
_COM_SMARTPTR_TYPEDEF(IActiveScriptParseProcedure, __uuidof(IActiveScriptParseProcedure));
_COM_SMARTPTR_TYPEDEF(IActiveScriptParseProcedureOld, __uuidof(IActiveScriptParseProcedureOld));
_COM_SMARTPTR_TYPEDEF(IActiveScriptSite, __uuidof(IActiveScriptSite));
_COM_SMARTPTR_TYPEDEF(IActiveScriptSiteInterruptPoll, __uuidof(IActiveScriptSiteInterruptPoll));
_COM_SMARTPTR_TYPEDEF(IActiveScriptSiteWindow, __uuidof(IActiveScriptSiteWindow));
_COM_SMARTPTR_TYPEDEF(IActiveScriptStats, __uuidof(IActiveScriptStats));
_COM_SMARTPTR_TYPEDEF(IAdviseSink, __uuidof(IAdviseSink));
_COM_SMARTPTR_TYPEDEF(IAdviseSink2, __uuidof(IAdviseSink2));
_COM_SMARTPTR_TYPEDEF(IAdviseSinkEx, __uuidof(IAdviseSinkEx));
_COM_SMARTPTR_TYPEDEF(IAsyncManager, __uuidof(IAsyncManager));
_COM_SMARTPTR_TYPEDEF(IAsyncSetup, __uuidof(IAsyncSetup));
_COM_SMARTPTR_TYPEDEF(IAuthenticate, __uuidof(IAuthenticate));
_COM_SMARTPTR_TYPEDEF(IBindCtx, __uuidof(IBindCtx));
_COM_SMARTPTR_TYPEDEF(IBindEventHandler, __uuidof(IBindEventHandler));
_COM_SMARTPTR_TYPEDEF(IBindHost, __uuidof(IBindHost));
_COM_SMARTPTR_TYPEDEF(IBindProtocol, __uuidof(IBindProtocol));
_COM_SMARTPTR_TYPEDEF(IBindStatusCallback, __uuidof(IBindStatusCallback));
_COM_SMARTPTR_TYPEDEF(IBinding, __uuidof(IBinding));
_COM_SMARTPTR_TYPEDEF(ICSSFilter, __uuidof(ICSSFilter));
_COM_SMARTPTR_TYPEDEF(ICSSFilterSite, __uuidof(ICSSFilterSite));
_COM_SMARTPTR_TYPEDEF(ICancelMethodCalls, __uuidof(ICancelMethodCalls));
_COM_SMARTPTR_TYPEDEF(ICatInformation, __uuidof(ICatInformation));
_COM_SMARTPTR_TYPEDEF(ICatRegister, __uuidof(ICatRegister));
_COM_SMARTPTR_TYPEDEF(IChannelHook, __uuidof(IChannelHook));
_COM_SMARTPTR_TYPEDEF(IChannelMgr, __uuidof(IChannelMgr));
_COM_SMARTPTR_TYPEDEF(IClassAccess, __uuidof(IClassAccess));
_COM_SMARTPTR_TYPEDEF(IClassActivator, __uuidof(IClassActivator));
_COM_SMARTPTR_TYPEDEF(IClassAdmin, __uuidof(IClassAdmin));
_COM_SMARTPTR_TYPEDEF(IClassFactory, __uuidof(IClassFactory));
_COM_SMARTPTR_TYPEDEF(IClassFactory2, __uuidof(IClassFactory2));
_COM_SMARTPTR_TYPEDEF(IClassRefresh, __uuidof(IClassRefresh));
_COM_SMARTPTR_TYPEDEF(IClientSecurity, __uuidof(IClientSecurity));
_COM_SMARTPTR_TYPEDEF(ICodeInstall, __uuidof(ICodeInstall));
_COM_SMARTPTR_TYPEDEF(ICommDlgBrowser, __uuidof(ICommDlgBrowser));
_COM_SMARTPTR_TYPEDEF(IConnectionPoint, __uuidof(IConnectionPoint));
_COM_SMARTPTR_TYPEDEF(IConnectionPointContainer, __uuidof(IConnectionPointContainer));
_COM_SMARTPTR_TYPEDEF(IContextMenu, __uuidof(IContextMenu));
_COM_SMARTPTR_TYPEDEF(IContextMenu2, __uuidof(IContextMenu2));
_COM_SMARTPTR_TYPEDEF(IContextMenu3, __uuidof(IContextMenu3));
_COM_SMARTPTR_TYPEDEF(IContinue, __uuidof(IContinue));
_COM_SMARTPTR_TYPEDEF(IContinueCallback, __uuidof(IContinueCallback));
_COM_SMARTPTR_TYPEDEF(ICreateErrorInfo, __uuidof(ICreateErrorInfo));
_COM_SMARTPTR_TYPEDEF(ICreateTypeInfo, __uuidof(ICreateTypeInfo));
_COM_SMARTPTR_TYPEDEF(ICreateTypeInfo2, __uuidof(ICreateTypeInfo2));
_COM_SMARTPTR_TYPEDEF(ICreateTypeLib, __uuidof(ICreateTypeLib));
_COM_SMARTPTR_TYPEDEF(ICreateTypeLib2, __uuidof(ICreateTypeLib2));
_COM_SMARTPTR_TYPEDEF(ICustomDoc, __uuidof(ICustomDoc));
_COM_SMARTPTR_TYPEDEF(IDataAdviseHolder, __uuidof(IDataAdviseHolder));
_COM_SMARTPTR_TYPEDEF(IDataFilter, __uuidof(IDataFilter));
_COM_SMARTPTR_TYPEDEF(IDataObject, __uuidof(IDataObject));
_COM_SMARTPTR_TYPEDEF(IDeskBand, __uuidof(IDeskBand));
_COM_SMARTPTR_TYPEDEF(IDirectWriterLock, __uuidof(IDirectWriterLock));
_COM_SMARTPTR_TYPEDEF(IDispError, __uuidof(IDispError));
_COM_SMARTPTR_TYPEDEF(IDispatch, __uuidof(IDispatch));
_COM_SMARTPTR_TYPEDEF(IDispatchEx, __uuidof(IDispatchEx));
_COM_SMARTPTR_TYPEDEF(IDocHostShowUI, __uuidof(IDocHostShowUI));
_COM_SMARTPTR_TYPEDEF(IDocHostUIHandler, __uuidof(IDocHostUIHandler));
_COM_SMARTPTR_TYPEDEF(IDockingWindow, __uuidof(IDockingWindow));
_COM_SMARTPTR_TYPEDEF(IDockingWindowFrame, __uuidof(IDockingWindowFrame));
_COM_SMARTPTR_TYPEDEF(IDockingWindowSite, __uuidof(IDockingWindowSite));
_COM_SMARTPTR_TYPEDEF(IDropSource, __uuidof(IDropSource));
_COM_SMARTPTR_TYPEDEF(IDropTarget, __uuidof(IDropTarget));
_COM_SMARTPTR_TYPEDEF(IEncodingFilterFactory, __uuidof(IEncodingFilterFactory));
_COM_SMARTPTR_TYPEDEF(IEnumCATEGORYINFO, __uuidof(IEnumCATEGORYINFO));
_COM_SMARTPTR_TYPEDEF(IEnumChannels, __uuidof(IEnumChannels));
_COM_SMARTPTR_TYPEDEF(IEnumClass, __uuidof(IEnumClass));
_COM_SMARTPTR_TYPEDEF(IEnumCodePage, __uuidof(IEnumCodePage));
_COM_SMARTPTR_TYPEDEF(IEnumConnectionPoints, __uuidof(IEnumConnectionPoints));
_COM_SMARTPTR_TYPEDEF(IEnumConnections, __uuidof(IEnumConnections));
_COM_SMARTPTR_TYPEDEF(IEnumFORMATETC, __uuidof(IEnumFORMATETC));
_COM_SMARTPTR_TYPEDEF(IEnumGUID, __uuidof(IEnumGUID));
_COM_SMARTPTR_TYPEDEF(IEnumHLITEM, __uuidof(IEnumHLITEM));
_COM_SMARTPTR_TYPEDEF(IEnumIDList, __uuidof(IEnumIDList));
_COM_SMARTPTR_TYPEDEF(IEnumMoniker, __uuidof(IEnumMoniker));
_COM_SMARTPTR_TYPEDEF(IEnumOLEVERB, __uuidof(IEnumOLEVERB));
_COM_SMARTPTR_TYPEDEF(IEnumOleDocumentViews, __uuidof(IEnumOleDocumentViews));
_COM_SMARTPTR_TYPEDEF(IEnumOleUndoUnits, __uuidof(IEnumOleUndoUnits));
_COM_SMARTPTR_TYPEDEF(IEnumPackage, __uuidof(IEnumPackage));
_COM_SMARTPTR_TYPEDEF(IEnumRfc1766, __uuidof(IEnumRfc1766));
_COM_SMARTPTR_TYPEDEF(IEnumSTATDATA, __uuidof(IEnumSTATDATA));
_COM_SMARTPTR_TYPEDEF(IEnumSTATPROPSETSTG, __uuidof(IEnumSTATPROPSETSTG));
_COM_SMARTPTR_TYPEDEF(IEnumSTATPROPSTG, __uuidof(IEnumSTATPROPSTG));
_COM_SMARTPTR_TYPEDEF(IEnumSTATSTG, __uuidof(IEnumSTATSTG));
_COM_SMARTPTR_TYPEDEF(IEnumSTATURL, __uuidof(IEnumSTATURL));
_COM_SMARTPTR_TYPEDEF(IEnumString, __uuidof(IEnumString));
_COM_SMARTPTR_TYPEDEF(IEnumUnknown, __uuidof(IEnumUnknown));
_COM_SMARTPTR_TYPEDEF(IEnumVARIANT, __uuidof(IEnumVARIANT));
_COM_SMARTPTR_TYPEDEF(IErrorInfo, __uuidof(IErrorInfo));
_COM_SMARTPTR_TYPEDEF(IErrorLog, __uuidof(IErrorLog));
_COM_SMARTPTR_TYPEDEF(IExtensionServices, __uuidof(IExtensionServices));
_COM_SMARTPTR_TYPEDEF(IExternalConnection, __uuidof(IExternalConnection));
_COM_SMARTPTR_TYPEDEF(IExtractIconA, __uuidof(IExtractIconA));
_COM_SMARTPTR_TYPEDEF(IExtractIconW, __uuidof(IExtractIconW));
_COM_SMARTPTR_TYPEDEF(IFileViewerA, __uuidof(IFileViewerA));
_COM_SMARTPTR_TYPEDEF(IFileViewerSite, __uuidof(IFileViewerSite));
_COM_SMARTPTR_TYPEDEF(IFileViewerW, __uuidof(IFileViewerW));
_COM_SMARTPTR_TYPEDEF(IFillLockBytes, __uuidof(IFillLockBytes));
_COM_SMARTPTR_TYPEDEF(IFilter, __uuidof(IFilter));
_COM_SMARTPTR_TYPEDEF(IFolderViewOC, __uuidof(IFolderViewOC));
_COM_SMARTPTR_TYPEDEF(IFont, __uuidof(IFont));
_COM_SMARTPTR_TYPEDEF(IFontDisp, __uuidof(IFontDisp));
_COM_SMARTPTR_TYPEDEF(IFontEventsDisp, __uuidof(IFontEventsDisp));
_COM_SMARTPTR_TYPEDEF(IGlobalInterfaceTable, __uuidof(IGlobalInterfaceTable));
_COM_SMARTPTR_TYPEDEF(IHTMLAnchorElement, __uuidof(IHTMLAnchorElement));
_COM_SMARTPTR_TYPEDEF(IHTMLAreaElement, __uuidof(IHTMLAreaElement));
_COM_SMARTPTR_TYPEDEF(IHTMLAreasCollection, __uuidof(IHTMLAreasCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLBGsound, __uuidof(IHTMLBGsound));
_COM_SMARTPTR_TYPEDEF(IHTMLBRElement, __uuidof(IHTMLBRElement));
_COM_SMARTPTR_TYPEDEF(IHTMLBaseElement, __uuidof(IHTMLBaseElement));
_COM_SMARTPTR_TYPEDEF(IHTMLBaseFontElement, __uuidof(IHTMLBaseFontElement));
_COM_SMARTPTR_TYPEDEF(IHTMLBlockElement, __uuidof(IHTMLBlockElement));
_COM_SMARTPTR_TYPEDEF(IHTMLBodyElement, __uuidof(IHTMLBodyElement));
_COM_SMARTPTR_TYPEDEF(IHTMLButtonElement, __uuidof(IHTMLButtonElement));
_COM_SMARTPTR_TYPEDEF(IHTMLCommentElement, __uuidof(IHTMLCommentElement));
_COM_SMARTPTR_TYPEDEF(IHTMLControlElement, __uuidof(IHTMLControlElement));
_COM_SMARTPTR_TYPEDEF(IHTMLControlRange, __uuidof(IHTMLControlRange));
_COM_SMARTPTR_TYPEDEF(IHTMLDDElement, __uuidof(IHTMLDDElement));
_COM_SMARTPTR_TYPEDEF(IHTMLDListElement, __uuidof(IHTMLDListElement));
_COM_SMARTPTR_TYPEDEF(IHTMLDTElement, __uuidof(IHTMLDTElement));
_COM_SMARTPTR_TYPEDEF(IHTMLDatabinding, __uuidof(IHTMLDatabinding));
_COM_SMARTPTR_TYPEDEF(IHTMLDialog, __uuidof(IHTMLDialog));
_COM_SMARTPTR_TYPEDEF(IHTMLDivElement, __uuidof(IHTMLDivElement));
_COM_SMARTPTR_TYPEDEF(IHTMLDivPosition, __uuidof(IHTMLDivPosition));
_COM_SMARTPTR_TYPEDEF(IHTMLDocument, __uuidof(IHTMLDocument));
_COM_SMARTPTR_TYPEDEF(IHTMLDocument2, __uuidof(IHTMLDocument2));
_COM_SMARTPTR_TYPEDEF(IHTMLElement, __uuidof(IHTMLElement));
_COM_SMARTPTR_TYPEDEF(IHTMLElementCollection, __uuidof(IHTMLElementCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLEmbedElement, __uuidof(IHTMLEmbedElement));
_COM_SMARTPTR_TYPEDEF(IHTMLEventObj, __uuidof(IHTMLEventObj));
_COM_SMARTPTR_TYPEDEF(IHTMLFieldSetElement, __uuidof(IHTMLFieldSetElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFiltersCollection, __uuidof(IHTMLFiltersCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLFontElement, __uuidof(IHTMLFontElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFontNamesCollection, __uuidof(IHTMLFontNamesCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLFontSizesCollection, __uuidof(IHTMLFontSizesCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLFormElement, __uuidof(IHTMLFormElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFrameBase, __uuidof(IHTMLFrameBase));
_COM_SMARTPTR_TYPEDEF(IHTMLFrameElement, __uuidof(IHTMLFrameElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFrameSetElement, __uuidof(IHTMLFrameSetElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFramesCollection2, __uuidof(IHTMLFramesCollection2));
_COM_SMARTPTR_TYPEDEF(IHTMLHRElement, __uuidof(IHTMLHRElement));
_COM_SMARTPTR_TYPEDEF(IHTMLHeaderElement, __uuidof(IHTMLHeaderElement));
_COM_SMARTPTR_TYPEDEF(IHTMLIFrameElement, __uuidof(IHTMLIFrameElement));
_COM_SMARTPTR_TYPEDEF(IHTMLImageElementFactory, __uuidof(IHTMLImageElementFactory));
_COM_SMARTPTR_TYPEDEF(IHTMLImgElement, __uuidof(IHTMLImgElement));
_COM_SMARTPTR_TYPEDEF(IHTMLInputButtonElement, __uuidof(IHTMLInputButtonElement));
_COM_SMARTPTR_TYPEDEF(IHTMLInputFileElement, __uuidof(IHTMLInputFileElement));
_COM_SMARTPTR_TYPEDEF(IHTMLInputHiddenElement, __uuidof(IHTMLInputHiddenElement));
_COM_SMARTPTR_TYPEDEF(IHTMLInputImage, __uuidof(IHTMLInputImage));
_COM_SMARTPTR_TYPEDEF(IHTMLInputTextElement, __uuidof(IHTMLInputTextElement));
_COM_SMARTPTR_TYPEDEF(IHTMLIsIndexElement, __uuidof(IHTMLIsIndexElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLIElement, __uuidof(IHTMLLIElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLabelElement, __uuidof(IHTMLLabelElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLegendElement, __uuidof(IHTMLLegendElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLinkElement, __uuidof(IHTMLLinkElement));
_COM_SMARTPTR_TYPEDEF(IHTMLListElement, __uuidof(IHTMLListElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLocation, __uuidof(IHTMLLocation));
_COM_SMARTPTR_TYPEDEF(IHTMLMapElement, __uuidof(IHTMLMapElement));
_COM_SMARTPTR_TYPEDEF(IHTMLMarqueeElement, __uuidof(IHTMLMarqueeElement));
_COM_SMARTPTR_TYPEDEF(IHTMLMetaElement, __uuidof(IHTMLMetaElement));
_COM_SMARTPTR_TYPEDEF(IHTMLMimeTypesCollection, __uuidof(IHTMLMimeTypesCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLNextIdElement, __uuidof(IHTMLNextIdElement));
_COM_SMARTPTR_TYPEDEF(IHTMLNoShowElement, __uuidof(IHTMLNoShowElement));
_COM_SMARTPTR_TYPEDEF(IHTMLOListElement, __uuidof(IHTMLOListElement));
_COM_SMARTPTR_TYPEDEF(IHTMLObjectElement, __uuidof(IHTMLObjectElement));
_COM_SMARTPTR_TYPEDEF(IHTMLOpsProfile, __uuidof(IHTMLOpsProfile));
_COM_SMARTPTR_TYPEDEF(IHTMLOptionButtonElement, __uuidof(IHTMLOptionButtonElement));
_COM_SMARTPTR_TYPEDEF(IHTMLOptionElement, __uuidof(IHTMLOptionElement));
_COM_SMARTPTR_TYPEDEF(IHTMLOptionElementFactory, __uuidof(IHTMLOptionElementFactory));
_COM_SMARTPTR_TYPEDEF(IHTMLOptionsHolder, __uuidof(IHTMLOptionsHolder));
_COM_SMARTPTR_TYPEDEF(IHTMLParaElement, __uuidof(IHTMLParaElement));
_COM_SMARTPTR_TYPEDEF(IHTMLPhraseElement, __uuidof(IHTMLPhraseElement));
_COM_SMARTPTR_TYPEDEF(IHTMLPluginsCollection, __uuidof(IHTMLPluginsCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLRuleStyle, __uuidof(IHTMLRuleStyle));
_COM_SMARTPTR_TYPEDEF(IHTMLScreen, __uuidof(IHTMLScreen));
_COM_SMARTPTR_TYPEDEF(IHTMLScriptElement, __uuidof(IHTMLScriptElement));
_COM_SMARTPTR_TYPEDEF(IHTMLSelectElement, __uuidof(IHTMLSelectElement));
_COM_SMARTPTR_TYPEDEF(IHTMLSelectionObject, __uuidof(IHTMLSelectionObject));
_COM_SMARTPTR_TYPEDEF(IHTMLSpanElement, __uuidof(IHTMLSpanElement));
_COM_SMARTPTR_TYPEDEF(IHTMLSpanFlow, __uuidof(IHTMLSpanFlow));
_COM_SMARTPTR_TYPEDEF(IHTMLStyle, __uuidof(IHTMLStyle));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleElement, __uuidof(IHTMLStyleElement));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleFontFace, __uuidof(IHTMLStyleFontFace));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleSheet, __uuidof(IHTMLStyleSheet));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleSheetRule, __uuidof(IHTMLStyleSheetRule));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleSheetRulesCollection, __uuidof(IHTMLStyleSheetRulesCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleSheetsCollection, __uuidof(IHTMLStyleSheetsCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLTable, __uuidof(IHTMLTable));
_COM_SMARTPTR_TYPEDEF(IHTMLTableCaption, __uuidof(IHTMLTableCaption));
_COM_SMARTPTR_TYPEDEF(IHTMLTableCell, __uuidof(IHTMLTableCell));
_COM_SMARTPTR_TYPEDEF(IHTMLTableCol, __uuidof(IHTMLTableCol));
_COM_SMARTPTR_TYPEDEF(IHTMLTableRow, __uuidof(IHTMLTableRow));
_COM_SMARTPTR_TYPEDEF(IHTMLTableSection, __uuidof(IHTMLTableSection));
_COM_SMARTPTR_TYPEDEF(IHTMLTextAreaElement, __uuidof(IHTMLTextAreaElement));
_COM_SMARTPTR_TYPEDEF(IHTMLTextContainer, __uuidof(IHTMLTextContainer));
_COM_SMARTPTR_TYPEDEF(IHTMLTextElement, __uuidof(IHTMLTextElement));
_COM_SMARTPTR_TYPEDEF(IHTMLTitleElement, __uuidof(IHTMLTitleElement));
_COM_SMARTPTR_TYPEDEF(IHTMLTxtRange, __uuidof(IHTMLTxtRange));
_COM_SMARTPTR_TYPEDEF(IHTMLUListElement, __uuidof(IHTMLUListElement));
_COM_SMARTPTR_TYPEDEF(IHTMLUnknownElement, __uuidof(IHTMLUnknownElement));
_COM_SMARTPTR_TYPEDEF(IHTMLWindow2, __uuidof(IHTMLWindow2));
_COM_SMARTPTR_TYPEDEF(IHlink, __uuidof(IHlink));
_COM_SMARTPTR_TYPEDEF(IHlinkBrowseContext, __uuidof(IHlinkBrowseContext));
_COM_SMARTPTR_TYPEDEF(IHlinkFrame, __uuidof(IHlinkFrame));
_COM_SMARTPTR_TYPEDEF(IHlinkSite, __uuidof(IHlinkSite));
_COM_SMARTPTR_TYPEDEF(IHlinkTarget, __uuidof(IHlinkTarget));
_COM_SMARTPTR_TYPEDEF(IHttpNegotiate, __uuidof(IHttpNegotiate));
_COM_SMARTPTR_TYPEDEF(IHttpSecurity, __uuidof(IHttpSecurity));
_COM_SMARTPTR_TYPEDEF(IImageDecodeEventSink, __uuidof(IImageDecodeEventSink));
_COM_SMARTPTR_TYPEDEF(IImageDecodeFilter, __uuidof(IImageDecodeFilter));
_COM_SMARTPTR_TYPEDEF(IImgCtx, __uuidof(IImgCtx));
_COM_SMARTPTR_TYPEDEF(IInputObject, __uuidof(IInputObject));
_COM_SMARTPTR_TYPEDEF(IInputObjectSite, __uuidof(IInputObjectSite));
_COM_SMARTPTR_TYPEDEF(IInternet, __uuidof(IInternet));
_COM_SMARTPTR_TYPEDEF(IInternetBindInfo, __uuidof(IInternetBindInfo));
_COM_SMARTPTR_TYPEDEF(IInternetHostSecurityManager, __uuidof(IInternetHostSecurityManager));
_COM_SMARTPTR_TYPEDEF(IInternetPriority, __uuidof(IInternetPriority));
_COM_SMARTPTR_TYPEDEF(IInternetProtocol, __uuidof(IInternetProtocol));
_COM_SMARTPTR_TYPEDEF(IInternetProtocolInfo, __uuidof(IInternetProtocolInfo));
_COM_SMARTPTR_TYPEDEF(IInternetProtocolRoot, __uuidof(IInternetProtocolRoot));
_COM_SMARTPTR_TYPEDEF(IInternetProtocolSink, __uuidof(IInternetProtocolSink));
_COM_SMARTPTR_TYPEDEF(IInternetSecurityManager, __uuidof(IInternetSecurityManager));
_COM_SMARTPTR_TYPEDEF(IInternetSecurityMgrSite, __uuidof(IInternetSecurityMgrSite));
_COM_SMARTPTR_TYPEDEF(IInternetSession, __uuidof(IInternetSession));
_COM_SMARTPTR_TYPEDEF(IInternetThreadSwitch, __uuidof(IInternetThreadSwitch));
_COM_SMARTPTR_TYPEDEF(IInternetZoneManager, __uuidof(IInternetZoneManager));
_COM_SMARTPTR_TYPEDEF(ILayoutStorage, __uuidof(ILayoutStorage));
_COM_SMARTPTR_TYPEDEF(ILockBytes, __uuidof(ILockBytes));
_COM_SMARTPTR_TYPEDEF(IMLangCodePages, __uuidof(IMLangCodePages));
_COM_SMARTPTR_TYPEDEF(IMLangConvertCharset, __uuidof(IMLangConvertCharset));
_COM_SMARTPTR_TYPEDEF(IMLangFontLink, __uuidof(IMLangFontLink));
_COM_SMARTPTR_TYPEDEF(IMLangLineBreakConsole, __uuidof(IMLangLineBreakConsole));
_COM_SMARTPTR_TYPEDEF(IMLangString, __uuidof(IMLangString));
_COM_SMARTPTR_TYPEDEF(IMLangStringAStr, __uuidof(IMLangStringAStr));
_COM_SMARTPTR_TYPEDEF(IMLangStringBufA, __uuidof(IMLangStringBufA));
_COM_SMARTPTR_TYPEDEF(IMLangStringBufW, __uuidof(IMLangStringBufW));
_COM_SMARTPTR_TYPEDEF(IMLangStringWStr, __uuidof(IMLangStringWStr));
_COM_SMARTPTR_TYPEDEF(IMalloc, __uuidof(IMalloc));
_COM_SMARTPTR_TYPEDEF(IMallocSpy, __uuidof(IMallocSpy));
_COM_SMARTPTR_TYPEDEF(IMapMIMEToCLSID, __uuidof(IMapMIMEToCLSID));
_COM_SMARTPTR_TYPEDEF(IMarshal, __uuidof(IMarshal));
_COM_SMARTPTR_TYPEDEF(IMessageFilter, __uuidof(IMessageFilter));
_COM_SMARTPTR_TYPEDEF(IMimeInfo, __uuidof(IMimeInfo));
_COM_SMARTPTR_TYPEDEF(IMoniker, __uuidof(IMoniker));
_COM_SMARTPTR_TYPEDEF(IMultiLanguage, __uuidof(IMultiLanguage));
_COM_SMARTPTR_TYPEDEF(IMultiQI, __uuidof(IMultiQI));
_COM_SMARTPTR_TYPEDEF(INewShortcutHookA, __uuidof(INewShortcutHookA));
_COM_SMARTPTR_TYPEDEF(INewShortcutHookW, __uuidof(INewShortcutHookW));
_COM_SMARTPTR_TYPEDEF(IObjectIdentity, __uuidof(IObjectIdentity));
_COM_SMARTPTR_TYPEDEF(IObjectSafety, __uuidof(IObjectSafety));
_COM_SMARTPTR_TYPEDEF(IObjectWithSite, __uuidof(IObjectWithSite));
_COM_SMARTPTR_TYPEDEF(IOleAdviseHolder, __uuidof(IOleAdviseHolder));
_COM_SMARTPTR_TYPEDEF(IOleCache, __uuidof(IOleCache));
_COM_SMARTPTR_TYPEDEF(IOleCache2, __uuidof(IOleCache2));
_COM_SMARTPTR_TYPEDEF(IOleCacheControl, __uuidof(IOleCacheControl));
_COM_SMARTPTR_TYPEDEF(IOleClientSite, __uuidof(IOleClientSite));
_COM_SMARTPTR_TYPEDEF(IOleCommandTarget, __uuidof(IOleCommandTarget));
_COM_SMARTPTR_TYPEDEF(IOleContainer, __uuidof(IOleContainer));
_COM_SMARTPTR_TYPEDEF(IOleControl, __uuidof(IOleControl));
_COM_SMARTPTR_TYPEDEF(IOleControlSite, __uuidof(IOleControlSite));
_COM_SMARTPTR_TYPEDEF(IOleDocument, __uuidof(IOleDocument));
_COM_SMARTPTR_TYPEDEF(IOleDocumentSite, __uuidof(IOleDocumentSite));
_COM_SMARTPTR_TYPEDEF(IOleDocumentView, __uuidof(IOleDocumentView));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceActiveObject, __uuidof(IOleInPlaceActiveObject));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceFrame, __uuidof(IOleInPlaceFrame));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceObject, __uuidof(IOleInPlaceObject));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceObjectWindowless, __uuidof(IOleInPlaceObjectWindowless));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceSite, __uuidof(IOleInPlaceSite));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceSiteEx, __uuidof(IOleInPlaceSiteEx));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceSiteWindowless, __uuidof(IOleInPlaceSiteWindowless));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceUIWindow, __uuidof(IOleInPlaceUIWindow));
_COM_SMARTPTR_TYPEDEF(IOleItemContainer, __uuidof(IOleItemContainer));
_COM_SMARTPTR_TYPEDEF(IOleLink, __uuidof(IOleLink));
_COM_SMARTPTR_TYPEDEF(IOleObject, __uuidof(IOleObject));
_COM_SMARTPTR_TYPEDEF(IOleParentUndoUnit, __uuidof(IOleParentUndoUnit));
_COM_SMARTPTR_TYPEDEF(IOleUndoManager, __uuidof(IOleUndoManager));
_COM_SMARTPTR_TYPEDEF(IOleUndoUnit, __uuidof(IOleUndoUnit));
_COM_SMARTPTR_TYPEDEF(IOleWindow, __uuidof(IOleWindow));
_COM_SMARTPTR_TYPEDEF(IOmHistory, __uuidof(IOmHistory));
_COM_SMARTPTR_TYPEDEF(IOmNavigator, __uuidof(IOmNavigator));
_COM_SMARTPTR_TYPEDEF(IPSFactoryBuffer, __uuidof(IPSFactoryBuffer));
_COM_SMARTPTR_TYPEDEF(IParseDisplayName, __uuidof(IParseDisplayName));
_COM_SMARTPTR_TYPEDEF(IPerPropertyBrowsing, __uuidof(IPerPropertyBrowsing));
_COM_SMARTPTR_TYPEDEF(IPersist, __uuidof(IPersist));
_COM_SMARTPTR_TYPEDEF(IPersistFile, __uuidof(IPersistFile));
_COM_SMARTPTR_TYPEDEF(IPersistFolder, __uuidof(IPersistFolder));
_COM_SMARTPTR_TYPEDEF(IPersistFolder2, __uuidof(IPersistFolder2));
_COM_SMARTPTR_TYPEDEF(IPersistHistory, __uuidof(IPersistHistory));
_COM_SMARTPTR_TYPEDEF(IPersistMemory, __uuidof(IPersistMemory));
_COM_SMARTPTR_TYPEDEF(IPersistMoniker, __uuidof(IPersistMoniker));
_COM_SMARTPTR_TYPEDEF(IPersistPropertyBag, __uuidof(IPersistPropertyBag));
_COM_SMARTPTR_TYPEDEF(IPersistPropertyBag2, __uuidof(IPersistPropertyBag2));
_COM_SMARTPTR_TYPEDEF(IPersistStorage, __uuidof(IPersistStorage));
_COM_SMARTPTR_TYPEDEF(IPersistStream, __uuidof(IPersistStream));
_COM_SMARTPTR_TYPEDEF(IPersistStreamInit, __uuidof(IPersistStreamInit));
_COM_SMARTPTR_TYPEDEF(IPicture, __uuidof(IPicture));
_COM_SMARTPTR_TYPEDEF(IPictureDisp, __uuidof(IPictureDisp));
_COM_SMARTPTR_TYPEDEF(IPointerInactive, __uuidof(IPointerInactive));
_COM_SMARTPTR_TYPEDEF(IPrint, __uuidof(IPrint));
_COM_SMARTPTR_TYPEDEF(IProgressNotify, __uuidof(IProgressNotify));
_COM_SMARTPTR_TYPEDEF(IPropertyBag, __uuidof(IPropertyBag));
_COM_SMARTPTR_TYPEDEF(IPropertyBag2, __uuidof(IPropertyBag2));
_COM_SMARTPTR_TYPEDEF(IPropertyNotifySink, __uuidof(IPropertyNotifySink));
_COM_SMARTPTR_TYPEDEF(IPropertyPage, __uuidof(IPropertyPage));
_COM_SMARTPTR_TYPEDEF(IPropertyPage2, __uuidof(IPropertyPage2));
_COM_SMARTPTR_TYPEDEF(IPropertyPageSite, __uuidof(IPropertyPageSite));
_COM_SMARTPTR_TYPEDEF(IPropertySetStorage, __uuidof(IPropertySetStorage));
_COM_SMARTPTR_TYPEDEF(IPropertyStorage, __uuidof(IPropertyStorage));
_COM_SMARTPTR_TYPEDEF(IProvideClassInfo, __uuidof(IProvideClassInfo));
_COM_SMARTPTR_TYPEDEF(IProvideClassInfo2, __uuidof(IProvideClassInfo2));
_COM_SMARTPTR_TYPEDEF(IProvideMultipleClassInfo, __uuidof(IProvideMultipleClassInfo));
_COM_SMARTPTR_TYPEDEF(IQueryInfo, __uuidof(IQueryInfo));
_COM_SMARTPTR_TYPEDEF(IQuickActivate, __uuidof(IQuickActivate));
_COM_SMARTPTR_TYPEDEF(IROTData, __uuidof(IROTData));
_COM_SMARTPTR_TYPEDEF(IRecordInfo, __uuidof(IRecordInfo));
_COM_SMARTPTR_TYPEDEF(IRichEditOle, __uuidof(IRichEditOle));
_COM_SMARTPTR_TYPEDEF(IRichEditOleCallback, __uuidof(IRichEditOleCallback));
_COM_SMARTPTR_TYPEDEF(IRootStorage, __uuidof(IRootStorage));
_COM_SMARTPTR_TYPEDEF(IRpcChannelBuffer, __uuidof(IRpcChannelBuffer));
_COM_SMARTPTR_TYPEDEF(IRpcChannelBuffer2, __uuidof(IRpcChannelBuffer2));
_COM_SMARTPTR_TYPEDEF(IRpcChannelBuffer3, __uuidof(IRpcChannelBuffer3));
_COM_SMARTPTR_TYPEDEF(IRpcProxyBuffer, __uuidof(IRpcProxyBuffer));
_COM_SMARTPTR_TYPEDEF(IRpcStubBuffer, __uuidof(IRpcStubBuffer));
_COM_SMARTPTR_TYPEDEF(IRunnableObject, __uuidof(IRunnableObject));
_COM_SMARTPTR_TYPEDEF(IRunningObjectTable, __uuidof(IRunningObjectTable));
_COM_SMARTPTR_TYPEDEF(ISequentialStream, __uuidof(ISequentialStream));
_COM_SMARTPTR_TYPEDEF(IServerSecurity, __uuidof(IServerSecurity));
_COM_SMARTPTR_TYPEDEF(IServiceProvider, __uuidof(IServiceProvider));
_COM_SMARTPTR_TYPEDEF(IShellBrowser, __uuidof(IShellBrowser));
_COM_SMARTPTR_TYPEDEF(IShellDispatch, __uuidof(IShellDispatch));
_COM_SMARTPTR_TYPEDEF(IShellExecuteHookA, __uuidof(IShellExecuteHookA));
_COM_SMARTPTR_TYPEDEF(IShellExecuteHookW, __uuidof(IShellExecuteHookW));
_COM_SMARTPTR_TYPEDEF(IShellExtInit, __uuidof(IShellExtInit));
_COM_SMARTPTR_TYPEDEF(IShellFolder, __uuidof(IShellFolder));
_COM_SMARTPTR_TYPEDEF(IShellFolderViewDual, __uuidof(IShellFolderViewDual));
_COM_SMARTPTR_TYPEDEF(IShellIcon, __uuidof(IShellIcon));
_COM_SMARTPTR_TYPEDEF(IShellIconOverlay, __uuidof(IShellIconOverlay));
_COM_SMARTPTR_TYPEDEF(IShellIconOverlayIdentifier, __uuidof(IShellIconOverlayIdentifier));
_COM_SMARTPTR_TYPEDEF(IShellLinkA, __uuidof(IShellLinkA));
_COM_SMARTPTR_TYPEDEF(IShellLinkDual, __uuidof(IShellLinkDual));
_COM_SMARTPTR_TYPEDEF(IShellLinkW, __uuidof(IShellLinkW));
_COM_SMARTPTR_TYPEDEF(IShellPropSheetExt, __uuidof(IShellPropSheetExt));
_COM_SMARTPTR_TYPEDEF(IShellUIHelper, __uuidof(IShellUIHelper));
_COM_SMARTPTR_TYPEDEF(IShellView, __uuidof(IShellView));
_COM_SMARTPTR_TYPEDEF(IShellView2, __uuidof(IShellView2));
_COM_SMARTPTR_TYPEDEF(IShellWindows, __uuidof(IShellWindows));
_COM_SMARTPTR_TYPEDEF(ISimpleFrameSite, __uuidof(ISimpleFrameSite));
_COM_SMARTPTR_TYPEDEF(ISoftDistExt, __uuidof(ISoftDistExt));
_COM_SMARTPTR_TYPEDEF(ISpecifyPropertyPages, __uuidof(ISpecifyPropertyPages));
_COM_SMARTPTR_TYPEDEF(IStdMarshalInfo, __uuidof(IStdMarshalInfo));
_COM_SMARTPTR_TYPEDEF(IStorage, __uuidof(IStorage));
_COM_SMARTPTR_TYPEDEF(IStream, __uuidof(IStream));
_COM_SMARTPTR_TYPEDEF(ISubscriptionMgr, __uuidof(ISubscriptionMgr));
_COM_SMARTPTR_TYPEDEF(ISupportErrorInfo, __uuidof(ISupportErrorInfo));
_COM_SMARTPTR_TYPEDEF(ISurrogate, __uuidof(ISurrogate));
_COM_SMARTPTR_TYPEDEF(ISynchronize, __uuidof(ISynchronize));
_COM_SMARTPTR_TYPEDEF(ISynchronizeEvent, __uuidof(ISynchronizeEvent));
_COM_SMARTPTR_TYPEDEF(ISynchronizeMutex, __uuidof(ISynchronizeMutex));
_COM_SMARTPTR_TYPEDEF(ITimer, __uuidof(ITimer));
_COM_SMARTPTR_TYPEDEF(ITimerService, __uuidof(ITimerService));
_COM_SMARTPTR_TYPEDEF(ITimerSink, __uuidof(ITimerSink));
_COM_SMARTPTR_TYPEDEF(ITypeChangeEvents, __uuidof(ITypeChangeEvents));
_COM_SMARTPTR_TYPEDEF(ITypeComp, __uuidof(ITypeComp));
_COM_SMARTPTR_TYPEDEF(ITypeFactory, __uuidof(ITypeFactory));
_COM_SMARTPTR_TYPEDEF(ITypeInfo, __uuidof(ITypeInfo));
_COM_SMARTPTR_TYPEDEF(ITypeInfo2, __uuidof(ITypeInfo2));
_COM_SMARTPTR_TYPEDEF(ITypeLib, __uuidof(ITypeLib));
_COM_SMARTPTR_TYPEDEF(ITypeLib2, __uuidof(ITypeLib2));
_COM_SMARTPTR_TYPEDEF(ITypeMarshal, __uuidof(ITypeMarshal));
_COM_SMARTPTR_TYPEDEF(IURLSearchHook, __uuidof(IURLSearchHook));
_COM_SMARTPTR_TYPEDEF(IUniformResourceLocatorA, __uuidof(IUniformResourceLocatorA));
_COM_SMARTPTR_TYPEDEF(IUniformResourceLocatorW, __uuidof(IUniformResourceLocatorW));
_COM_SMARTPTR_TYPEDEF(IUnknown, __uuidof(IUnknown));
_COM_SMARTPTR_TYPEDEF(IUrlHistoryNotify, __uuidof(IUrlHistoryNotify));
_COM_SMARTPTR_TYPEDEF(IUrlHistoryStg, __uuidof(IUrlHistoryStg));
_COM_SMARTPTR_TYPEDEF(IUrlHistoryStg2, __uuidof(IUrlHistoryStg2));
_COM_SMARTPTR_TYPEDEF(IUrlMon, __uuidof(IUrlMon));
_COM_SMARTPTR_TYPEDEF(IVariantChangeType, __uuidof(IVariantChangeType));
_COM_SMARTPTR_TYPEDEF(IViewFilterSite, __uuidof(IViewFilterSite));
_COM_SMARTPTR_TYPEDEF(IViewObject, __uuidof(IViewObject));
_COM_SMARTPTR_TYPEDEF(IViewObject2, __uuidof(IViewObject2));
_COM_SMARTPTR_TYPEDEF(IViewObjectEx, __uuidof(IViewObjectEx));
_COM_SMARTPTR_TYPEDEF(IViewTransition, __uuidof(IViewTransition));
_COM_SMARTPTR_TYPEDEF(IViewTransitionSite, __uuidof(IViewTransitionSite));
_COM_SMARTPTR_TYPEDEF(IWaitMultiple, __uuidof(IWaitMultiple));
_COM_SMARTPTR_TYPEDEF(IWebBrowser, __uuidof(IWebBrowser));
_COM_SMARTPTR_TYPEDEF(IWebBrowser2, __uuidof(IWebBrowser2));
_COM_SMARTPTR_TYPEDEF(IWebBrowserApp, __uuidof(IWebBrowserApp));
_COM_SMARTPTR_TYPEDEF(IWinInetHttpInfo, __uuidof(IWinInetHttpInfo));
_COM_SMARTPTR_TYPEDEF(IWinInetInfo, __uuidof(IWinInetInfo));
_COM_SMARTPTR_TYPEDEF(IWindowForBindingUI, __uuidof(IWindowForBindingUI));
_COM_SMARTPTR_TYPEDEF(IXMLDocument, __uuidof(IXMLDocument));
_COM_SMARTPTR_TYPEDEF(IXMLElement, __uuidof(IXMLElement));
_COM_SMARTPTR_TYPEDEF(IXMLElementCollection, __uuidof(IXMLElementCollection));
_COM_SMARTPTR_TYPEDEF(IXMLElementNotificationSink, __uuidof(IXMLElementNotificationSink));
_COM_SMARTPTR_TYPEDEF(IXMLError, __uuidof(IXMLError));
_COM_SMARTPTR_TYPEDEF(OLEDBSimpleProvider, __uuidof(OLEDBSimpleProvider));
_COM_SMARTPTR_TYPEDEF(OLEDBSimpleProviderListener, __uuidof(OLEDBSimpleProviderListener));

Автор: azesmcar 19.6.2009, 23:34
Цитата(ДокторТуамОсес @  19.6.2009,  23:32 Найти цитируемый пост)
Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0

А кто говорил что его читать надо? smile 
Вы еще бинарник попробуйте прочитать.

Автор: ДокторТуамОсес 19.6.2009, 23:38
Цитата(azesmcar @  19.6.2009,  23:34 Найти цитируемый пост)
А кто говорил что его читать надо?

Тема называется "как не надо писать код"

Но ведь код из моего примера был написан кем-то.
Да не кем-то, а самой главной программистской фирмой - "Microsoft"

Автор: azesmcar 19.6.2009, 23:41
Цитата(ДокторТуамОсес @  19.6.2009,  23:38 Найти цитируемый пост)
Тема называется "как не надо писать код"

Это сложно назвать кодом. Это обыкновенный def файл, по другому он и не мог выглядеть, тут нет логики и нет выполнения инструкций..обыкновенные обявления.

Цитата(ДокторТуамОсес @  19.6.2009,  23:38 Найти цитируемый пост)
Но ведь код из моего примера был написан кем-то.
Да не кем-то, а самой главной программистской фирмой - "Microsoft" 

Хотите поглядеть на плохой код микрософта - загляните в MFC. 

Автор: nix_crash 20.6.2009, 23:25
Цитата(azesmcar @  19.6.2009,  23:41 Найти цитируемый пост)
Хотите поглядеть на плохой код микрософта - загляните в MFC.  

 smile 

Автор: ДокторТуамОсес 21.6.2009, 23:00
Цитата(azesmcar @  19.6.2009,  23:41 Найти цитируемый пост)
Хотите поглядеть на плохой код микрософта - загляните в MFC.  

«Предыдущий оратор, который убеждал нас пользоваться библиотекой Microsoft Foundation Class (MFC), сказал нам, что поддержка OLE в MFC "включает 20000 строк кода, необходимых для каждого /*  smile   */ базового приложения OLE 2.0". Аудитория была ошеломлена не полезностью MFC, а тем фактом, что для написания базового приложения OLE 2.0 требуется 20000 строк кода. Любой интерфейс такой сложности таит в себе изъян. Следующие несколько правил используют OLE для показа характерных проблем, но не думайте, что проблема запутанности характерна лишь для Microsoft - она свойственна всей отрасли.» © [6, стр.7]

Автор: GoldFinch 21.6.2009, 23:25
вместо switch
Код

// .h
class NetworkError
{
public:
    enum err
    {
        OK=0,
        ConnectError,
        RecvError,
        SendError,
        WaitError,
        error_count__ /* длина списка ошибок */
    };
    static void Print(int e);
private:
    static const char* const messages[];
};

// .cpp
const char* const NetworkError::messages[NetworkError::error_count__] =
{
    /*OK*/ "-",
    /*ConnectError*/ "при коннекте",
    /*RecvError*/ "при приеме пакета",
    /*SendError*/ "при отправке пакета",
    /*WaitError*/ "при ожидании пакета",    
};

void NetworkError::Print( int e )
{
    std::cout
        <<"Ошибка сети: "<<messages[e]
        <<" ("<<std::dec<<WSAGetLastError()<<")"
        <<std::endl;
}


Код

class LoginServerHandler 
{
public:
        LoginServerHandler(Config& cfg_):cfg(cfg_){}    
        int Run();
private:
        typedef bool(LoginServerHandler::* packethandler_t)();
        static const packethandler_t handlers[];
        bool Dispatch(int id);
private:
        bool OnInit();
        bool OnLoginFail();
        bool OnLoginOK();
        bool OnPlayFail();
        bool OnPlayOK();
        bool OnServerList();
        bool OnUnknownPacket();
...

const LoginServerHandler::packethandler_t LoginServerHandler::handlers[]=
{
        /* 0x00 */      &LoginServerHandler::OnInit,
        /* 0x01 */      &LoginServerHandler::OnLoginFail,
        /* 0x02 */      &LoginServerHandler::OnUnknownPacket,
        /* 0x03 */      &LoginServerHandler::OnLoginOK,
        /* 0x04 */      &LoginServerHandler::OnServerList,
        /* 0x05 */      &LoginServerHandler::OnUnknownPacket,
        /* 0x06 */      &LoginServerHandler::OnPlayFail,
        /* 0x07 */      &LoginServerHandler::OnPlayOK,
};

bool LoginServerHandler::Dispatch(int id)
{       
        if (id<sizeof(handlers)/sizeof(handlers[0]))
                return (this->*handlers[id])();
        else
                return OnUnknownPacket();
}



Добавлено через 9 минут и 50 секунд
Цитата(ДокторТуамОсес @  20.6.2009,  00:38 Найти цитируемый пост)
Тема называется "как не надо писать код"

Но ведь код из моего примера был написан кем-то.
Да не кем-то, а самой главной программистской фирмой - "Microsoft" 

у меня есть файл Excel где забиты формулы вида
=ПОДСТАВИТЬ($B$1;"$";A3)
=ПОДСТАВИТЬ($B$1;"$";A4)
...
что позволяет сгенерить любое число однотипных строчек по списку подстановки

да, Excel пишет плохой код...

Автор: azesmcar 22.6.2009, 10:28
Цитата(ДокторТуамОсес @  21.6.2009,  23:00 Найти цитируемый пост)
Предыдущий оратор, который убеждал нас пользоваться библиотекой Microsoft Foundation Class (MFC), 

Какой еще оратор? Или это цитата? Тогда откуда?

Автор: jonie 22.6.2009, 10:37
Цитата(ДокторТуамОсес @ 19.6.2009,  23:32)
Ругаете свитч на 10 вариантов?
Говорите что это "ужас", "кошмар"?

А как Вам это (то что я привёл ниже)?

Это очень читабельно?
Это не "ужас"?

Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0

Всем понятно что делает этот код?

Код


// Interface Smart Pointers:

_COM_SMARTPTR_TYPEDEF(FolderItem, __uuidof(FolderItem));
_COM_SMARTPTR_TYPEDEF(FolderItemVerb, __uuidof(FolderItemVerb));
_COM_SMARTPTR_TYPEDEF(FolderItemVerbs, __uuidof(FolderItemVerbs));
_COM_SMARTPTR_TYPEDEF(FolderItems, __uuidof(FolderItems));
_COM_SMARTPTR_TYPEDEF(IAccessible, __uuidof(IAccessible));
_COM_SMARTPTR_TYPEDEF(IActiveDesktop, __uuidof(IActiveDesktop));
_COM_SMARTPTR_TYPEDEF(IActiveScript, __uuidof(IActiveScript));
_COM_SMARTPTR_TYPEDEF(IActiveScriptError, __uuidof(IActiveScriptError));
_COM_SMARTPTR_TYPEDEF(IActiveScriptParse, __uuidof(IActiveScriptParse));
_COM_SMARTPTR_TYPEDEF(IActiveScriptParseProcedure, __uuidof(IActiveScriptParseProcedure));
_COM_SMARTPTR_TYPEDEF(IActiveScriptParseProcedureOld, __uuidof(IActiveScriptParseProcedureOld));
_COM_SMARTPTR_TYPEDEF(IActiveScriptSite, __uuidof(IActiveScriptSite));
_COM_SMARTPTR_TYPEDEF(IActiveScriptSiteInterruptPoll, __uuidof(IActiveScriptSiteInterruptPoll));
_COM_SMARTPTR_TYPEDEF(IActiveScriptSiteWindow, __uuidof(IActiveScriptSiteWindow));
_COM_SMARTPTR_TYPEDEF(IActiveScriptStats, __uuidof(IActiveScriptStats));
_COM_SMARTPTR_TYPEDEF(IAdviseSink, __uuidof(IAdviseSink));
_COM_SMARTPTR_TYPEDEF(IAdviseSink2, __uuidof(IAdviseSink2));
_COM_SMARTPTR_TYPEDEF(IAdviseSinkEx, __uuidof(IAdviseSinkEx));
_COM_SMARTPTR_TYPEDEF(IAsyncManager, __uuidof(IAsyncManager));
_COM_SMARTPTR_TYPEDEF(IAsyncSetup, __uuidof(IAsyncSetup));
_COM_SMARTPTR_TYPEDEF(IAuthenticate, __uuidof(IAuthenticate));
_COM_SMARTPTR_TYPEDEF(IBindCtx, __uuidof(IBindCtx));
_COM_SMARTPTR_TYPEDEF(IBindEventHandler, __uuidof(IBindEventHandler));
_COM_SMARTPTR_TYPEDEF(IBindHost, __uuidof(IBindHost));
_COM_SMARTPTR_TYPEDEF(IBindProtocol, __uuidof(IBindProtocol));
_COM_SMARTPTR_TYPEDEF(IBindStatusCallback, __uuidof(IBindStatusCallback));
_COM_SMARTPTR_TYPEDEF(IBinding, __uuidof(IBinding));
_COM_SMARTPTR_TYPEDEF(ICSSFilter, __uuidof(ICSSFilter));
_COM_SMARTPTR_TYPEDEF(ICSSFilterSite, __uuidof(ICSSFilterSite));
_COM_SMARTPTR_TYPEDEF(ICancelMethodCalls, __uuidof(ICancelMethodCalls));
_COM_SMARTPTR_TYPEDEF(ICatInformation, __uuidof(ICatInformation));
_COM_SMARTPTR_TYPEDEF(ICatRegister, __uuidof(ICatRegister));
_COM_SMARTPTR_TYPEDEF(IChannelHook, __uuidof(IChannelHook));
_COM_SMARTPTR_TYPEDEF(IChannelMgr, __uuidof(IChannelMgr));
_COM_SMARTPTR_TYPEDEF(IClassAccess, __uuidof(IClassAccess));
_COM_SMARTPTR_TYPEDEF(IClassActivator, __uuidof(IClassActivator));
_COM_SMARTPTR_TYPEDEF(IClassAdmin, __uuidof(IClassAdmin));
_COM_SMARTPTR_TYPEDEF(IClassFactory, __uuidof(IClassFactory));
_COM_SMARTPTR_TYPEDEF(IClassFactory2, __uuidof(IClassFactory2));
_COM_SMARTPTR_TYPEDEF(IClassRefresh, __uuidof(IClassRefresh));
_COM_SMARTPTR_TYPEDEF(IClientSecurity, __uuidof(IClientSecurity));
_COM_SMARTPTR_TYPEDEF(ICodeInstall, __uuidof(ICodeInstall));
_COM_SMARTPTR_TYPEDEF(ICommDlgBrowser, __uuidof(ICommDlgBrowser));
_COM_SMARTPTR_TYPEDEF(IConnectionPoint, __uuidof(IConnectionPoint));
_COM_SMARTPTR_TYPEDEF(IConnectionPointContainer, __uuidof(IConnectionPointContainer));
_COM_SMARTPTR_TYPEDEF(IContextMenu, __uuidof(IContextMenu));
_COM_SMARTPTR_TYPEDEF(IContextMenu2, __uuidof(IContextMenu2));
_COM_SMARTPTR_TYPEDEF(IContextMenu3, __uuidof(IContextMenu3));
_COM_SMARTPTR_TYPEDEF(IContinue, __uuidof(IContinue));
_COM_SMARTPTR_TYPEDEF(IContinueCallback, __uuidof(IContinueCallback));
_COM_SMARTPTR_TYPEDEF(ICreateErrorInfo, __uuidof(ICreateErrorInfo));
_COM_SMARTPTR_TYPEDEF(ICreateTypeInfo, __uuidof(ICreateTypeInfo));
_COM_SMARTPTR_TYPEDEF(ICreateTypeInfo2, __uuidof(ICreateTypeInfo2));
_COM_SMARTPTR_TYPEDEF(ICreateTypeLib, __uuidof(ICreateTypeLib));
_COM_SMARTPTR_TYPEDEF(ICreateTypeLib2, __uuidof(ICreateTypeLib2));
_COM_SMARTPTR_TYPEDEF(ICustomDoc, __uuidof(ICustomDoc));
_COM_SMARTPTR_TYPEDEF(IDataAdviseHolder, __uuidof(IDataAdviseHolder));
_COM_SMARTPTR_TYPEDEF(IDataFilter, __uuidof(IDataFilter));
_COM_SMARTPTR_TYPEDEF(IDataObject, __uuidof(IDataObject));
_COM_SMARTPTR_TYPEDEF(IDeskBand, __uuidof(IDeskBand));
_COM_SMARTPTR_TYPEDEF(IDirectWriterLock, __uuidof(IDirectWriterLock));
_COM_SMARTPTR_TYPEDEF(IDispError, __uuidof(IDispError));
_COM_SMARTPTR_TYPEDEF(IDispatch, __uuidof(IDispatch));
_COM_SMARTPTR_TYPEDEF(IDispatchEx, __uuidof(IDispatchEx));
_COM_SMARTPTR_TYPEDEF(IDocHostShowUI, __uuidof(IDocHostShowUI));
_COM_SMARTPTR_TYPEDEF(IDocHostUIHandler, __uuidof(IDocHostUIHandler));
_COM_SMARTPTR_TYPEDEF(IDockingWindow, __uuidof(IDockingWindow));
_COM_SMARTPTR_TYPEDEF(IDockingWindowFrame, __uuidof(IDockingWindowFrame));
_COM_SMARTPTR_TYPEDEF(IDockingWindowSite, __uuidof(IDockingWindowSite));
_COM_SMARTPTR_TYPEDEF(IDropSource, __uuidof(IDropSource));
_COM_SMARTPTR_TYPEDEF(IDropTarget, __uuidof(IDropTarget));
_COM_SMARTPTR_TYPEDEF(IEncodingFilterFactory, __uuidof(IEncodingFilterFactory));
_COM_SMARTPTR_TYPEDEF(IEnumCATEGORYINFO, __uuidof(IEnumCATEGORYINFO));
_COM_SMARTPTR_TYPEDEF(IEnumChannels, __uuidof(IEnumChannels));
_COM_SMARTPTR_TYPEDEF(IEnumClass, __uuidof(IEnumClass));
_COM_SMARTPTR_TYPEDEF(IEnumCodePage, __uuidof(IEnumCodePage));
_COM_SMARTPTR_TYPEDEF(IEnumConnectionPoints, __uuidof(IEnumConnectionPoints));
_COM_SMARTPTR_TYPEDEF(IEnumConnections, __uuidof(IEnumConnections));
_COM_SMARTPTR_TYPEDEF(IEnumFORMATETC, __uuidof(IEnumFORMATETC));
_COM_SMARTPTR_TYPEDEF(IEnumGUID, __uuidof(IEnumGUID));
_COM_SMARTPTR_TYPEDEF(IEnumHLITEM, __uuidof(IEnumHLITEM));
_COM_SMARTPTR_TYPEDEF(IEnumIDList, __uuidof(IEnumIDList));
_COM_SMARTPTR_TYPEDEF(IEnumMoniker, __uuidof(IEnumMoniker));
_COM_SMARTPTR_TYPEDEF(IEnumOLEVERB, __uuidof(IEnumOLEVERB));
_COM_SMARTPTR_TYPEDEF(IEnumOleDocumentViews, __uuidof(IEnumOleDocumentViews));
_COM_SMARTPTR_TYPEDEF(IEnumOleUndoUnits, __uuidof(IEnumOleUndoUnits));
_COM_SMARTPTR_TYPEDEF(IEnumPackage, __uuidof(IEnumPackage));
_COM_SMARTPTR_TYPEDEF(IEnumRfc1766, __uuidof(IEnumRfc1766));
_COM_SMARTPTR_TYPEDEF(IEnumSTATDATA, __uuidof(IEnumSTATDATA));
_COM_SMARTPTR_TYPEDEF(IEnumSTATPROPSETSTG, __uuidof(IEnumSTATPROPSETSTG));
_COM_SMARTPTR_TYPEDEF(IEnumSTATPROPSTG, __uuidof(IEnumSTATPROPSTG));
_COM_SMARTPTR_TYPEDEF(IEnumSTATSTG, __uuidof(IEnumSTATSTG));
_COM_SMARTPTR_TYPEDEF(IEnumSTATURL, __uuidof(IEnumSTATURL));
_COM_SMARTPTR_TYPEDEF(IEnumString, __uuidof(IEnumString));
_COM_SMARTPTR_TYPEDEF(IEnumUnknown, __uuidof(IEnumUnknown));
_COM_SMARTPTR_TYPEDEF(IEnumVARIANT, __uuidof(IEnumVARIANT));
_COM_SMARTPTR_TYPEDEF(IErrorInfo, __uuidof(IErrorInfo));
_COM_SMARTPTR_TYPEDEF(IErrorLog, __uuidof(IErrorLog));
_COM_SMARTPTR_TYPEDEF(IExtensionServices, __uuidof(IExtensionServices));
_COM_SMARTPTR_TYPEDEF(IExternalConnection, __uuidof(IExternalConnection));
_COM_SMARTPTR_TYPEDEF(IExtractIconA, __uuidof(IExtractIconA));
_COM_SMARTPTR_TYPEDEF(IExtractIconW, __uuidof(IExtractIconW));
_COM_SMARTPTR_TYPEDEF(IFileViewerA, __uuidof(IFileViewerA));
_COM_SMARTPTR_TYPEDEF(IFileViewerSite, __uuidof(IFileViewerSite));
_COM_SMARTPTR_TYPEDEF(IFileViewerW, __uuidof(IFileViewerW));
_COM_SMARTPTR_TYPEDEF(IFillLockBytes, __uuidof(IFillLockBytes));
_COM_SMARTPTR_TYPEDEF(IFilter, __uuidof(IFilter));
_COM_SMARTPTR_TYPEDEF(IFolderViewOC, __uuidof(IFolderViewOC));
_COM_SMARTPTR_TYPEDEF(IFont, __uuidof(IFont));
_COM_SMARTPTR_TYPEDEF(IFontDisp, __uuidof(IFontDisp));
_COM_SMARTPTR_TYPEDEF(IFontEventsDisp, __uuidof(IFontEventsDisp));
_COM_SMARTPTR_TYPEDEF(IGlobalInterfaceTable, __uuidof(IGlobalInterfaceTable));
_COM_SMARTPTR_TYPEDEF(IHTMLAnchorElement, __uuidof(IHTMLAnchorElement));
_COM_SMARTPTR_TYPEDEF(IHTMLAreaElement, __uuidof(IHTMLAreaElement));
_COM_SMARTPTR_TYPEDEF(IHTMLAreasCollection, __uuidof(IHTMLAreasCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLBGsound, __uuidof(IHTMLBGsound));
_COM_SMARTPTR_TYPEDEF(IHTMLBRElement, __uuidof(IHTMLBRElement));
_COM_SMARTPTR_TYPEDEF(IHTMLBaseElement, __uuidof(IHTMLBaseElement));
_COM_SMARTPTR_TYPEDEF(IHTMLBaseFontElement, __uuidof(IHTMLBaseFontElement));
_COM_SMARTPTR_TYPEDEF(IHTMLBlockElement, __uuidof(IHTMLBlockElement));
_COM_SMARTPTR_TYPEDEF(IHTMLBodyElement, __uuidof(IHTMLBodyElement));
_COM_SMARTPTR_TYPEDEF(IHTMLButtonElement, __uuidof(IHTMLButtonElement));
_COM_SMARTPTR_TYPEDEF(IHTMLCommentElement, __uuidof(IHTMLCommentElement));
_COM_SMARTPTR_TYPEDEF(IHTMLControlElement, __uuidof(IHTMLControlElement));
_COM_SMARTPTR_TYPEDEF(IHTMLControlRange, __uuidof(IHTMLControlRange));
_COM_SMARTPTR_TYPEDEF(IHTMLDDElement, __uuidof(IHTMLDDElement));
_COM_SMARTPTR_TYPEDEF(IHTMLDListElement, __uuidof(IHTMLDListElement));
_COM_SMARTPTR_TYPEDEF(IHTMLDTElement, __uuidof(IHTMLDTElement));
_COM_SMARTPTR_TYPEDEF(IHTMLDatabinding, __uuidof(IHTMLDatabinding));
_COM_SMARTPTR_TYPEDEF(IHTMLDialog, __uuidof(IHTMLDialog));
_COM_SMARTPTR_TYPEDEF(IHTMLDivElement, __uuidof(IHTMLDivElement));
_COM_SMARTPTR_TYPEDEF(IHTMLDivPosition, __uuidof(IHTMLDivPosition));
_COM_SMARTPTR_TYPEDEF(IHTMLDocument, __uuidof(IHTMLDocument));
_COM_SMARTPTR_TYPEDEF(IHTMLDocument2, __uuidof(IHTMLDocument2));
_COM_SMARTPTR_TYPEDEF(IHTMLElement, __uuidof(IHTMLElement));
_COM_SMARTPTR_TYPEDEF(IHTMLElementCollection, __uuidof(IHTMLElementCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLEmbedElement, __uuidof(IHTMLEmbedElement));
_COM_SMARTPTR_TYPEDEF(IHTMLEventObj, __uuidof(IHTMLEventObj));
_COM_SMARTPTR_TYPEDEF(IHTMLFieldSetElement, __uuidof(IHTMLFieldSetElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFiltersCollection, __uuidof(IHTMLFiltersCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLFontElement, __uuidof(IHTMLFontElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFontNamesCollection, __uuidof(IHTMLFontNamesCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLFontSizesCollection, __uuidof(IHTMLFontSizesCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLFormElement, __uuidof(IHTMLFormElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFrameBase, __uuidof(IHTMLFrameBase));
_COM_SMARTPTR_TYPEDEF(IHTMLFrameElement, __uuidof(IHTMLFrameElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFrameSetElement, __uuidof(IHTMLFrameSetElement));
_COM_SMARTPTR_TYPEDEF(IHTMLFramesCollection2, __uuidof(IHTMLFramesCollection2));
_COM_SMARTPTR_TYPEDEF(IHTMLHRElement, __uuidof(IHTMLHRElement));
_COM_SMARTPTR_TYPEDEF(IHTMLHeaderElement, __uuidof(IHTMLHeaderElement));
_COM_SMARTPTR_TYPEDEF(IHTMLIFrameElement, __uuidof(IHTMLIFrameElement));
_COM_SMARTPTR_TYPEDEF(IHTMLImageElementFactory, __uuidof(IHTMLImageElementFactory));
_COM_SMARTPTR_TYPEDEF(IHTMLImgElement, __uuidof(IHTMLImgElement));
_COM_SMARTPTR_TYPEDEF(IHTMLInputButtonElement, __uuidof(IHTMLInputButtonElement));
_COM_SMARTPTR_TYPEDEF(IHTMLInputFileElement, __uuidof(IHTMLInputFileElement));
_COM_SMARTPTR_TYPEDEF(IHTMLInputHiddenElement, __uuidof(IHTMLInputHiddenElement));
_COM_SMARTPTR_TYPEDEF(IHTMLInputImage, __uuidof(IHTMLInputImage));
_COM_SMARTPTR_TYPEDEF(IHTMLInputTextElement, __uuidof(IHTMLInputTextElement));
_COM_SMARTPTR_TYPEDEF(IHTMLIsIndexElement, __uuidof(IHTMLIsIndexElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLIElement, __uuidof(IHTMLLIElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLabelElement, __uuidof(IHTMLLabelElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLegendElement, __uuidof(IHTMLLegendElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLinkElement, __uuidof(IHTMLLinkElement));
_COM_SMARTPTR_TYPEDEF(IHTMLListElement, __uuidof(IHTMLListElement));
_COM_SMARTPTR_TYPEDEF(IHTMLLocation, __uuidof(IHTMLLocation));
_COM_SMARTPTR_TYPEDEF(IHTMLMapElement, __uuidof(IHTMLMapElement));
_COM_SMARTPTR_TYPEDEF(IHTMLMarqueeElement, __uuidof(IHTMLMarqueeElement));
_COM_SMARTPTR_TYPEDEF(IHTMLMetaElement, __uuidof(IHTMLMetaElement));
_COM_SMARTPTR_TYPEDEF(IHTMLMimeTypesCollection, __uuidof(IHTMLMimeTypesCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLNextIdElement, __uuidof(IHTMLNextIdElement));
_COM_SMARTPTR_TYPEDEF(IHTMLNoShowElement, __uuidof(IHTMLNoShowElement));
_COM_SMARTPTR_TYPEDEF(IHTMLOListElement, __uuidof(IHTMLOListElement));
_COM_SMARTPTR_TYPEDEF(IHTMLObjectElement, __uuidof(IHTMLObjectElement));
_COM_SMARTPTR_TYPEDEF(IHTMLOpsProfile, __uuidof(IHTMLOpsProfile));
_COM_SMARTPTR_TYPEDEF(IHTMLOptionButtonElement, __uuidof(IHTMLOptionButtonElement));
_COM_SMARTPTR_TYPEDEF(IHTMLOptionElement, __uuidof(IHTMLOptionElement));
_COM_SMARTPTR_TYPEDEF(IHTMLOptionElementFactory, __uuidof(IHTMLOptionElementFactory));
_COM_SMARTPTR_TYPEDEF(IHTMLOptionsHolder, __uuidof(IHTMLOptionsHolder));
_COM_SMARTPTR_TYPEDEF(IHTMLParaElement, __uuidof(IHTMLParaElement));
_COM_SMARTPTR_TYPEDEF(IHTMLPhraseElement, __uuidof(IHTMLPhraseElement));
_COM_SMARTPTR_TYPEDEF(IHTMLPluginsCollection, __uuidof(IHTMLPluginsCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLRuleStyle, __uuidof(IHTMLRuleStyle));
_COM_SMARTPTR_TYPEDEF(IHTMLScreen, __uuidof(IHTMLScreen));
_COM_SMARTPTR_TYPEDEF(IHTMLScriptElement, __uuidof(IHTMLScriptElement));
_COM_SMARTPTR_TYPEDEF(IHTMLSelectElement, __uuidof(IHTMLSelectElement));
_COM_SMARTPTR_TYPEDEF(IHTMLSelectionObject, __uuidof(IHTMLSelectionObject));
_COM_SMARTPTR_TYPEDEF(IHTMLSpanElement, __uuidof(IHTMLSpanElement));
_COM_SMARTPTR_TYPEDEF(IHTMLSpanFlow, __uuidof(IHTMLSpanFlow));
_COM_SMARTPTR_TYPEDEF(IHTMLStyle, __uuidof(IHTMLStyle));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleElement, __uuidof(IHTMLStyleElement));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleFontFace, __uuidof(IHTMLStyleFontFace));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleSheet, __uuidof(IHTMLStyleSheet));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleSheetRule, __uuidof(IHTMLStyleSheetRule));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleSheetRulesCollection, __uuidof(IHTMLStyleSheetRulesCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLStyleSheetsCollection, __uuidof(IHTMLStyleSheetsCollection));
_COM_SMARTPTR_TYPEDEF(IHTMLTable, __uuidof(IHTMLTable));
_COM_SMARTPTR_TYPEDEF(IHTMLTableCaption, __uuidof(IHTMLTableCaption));
_COM_SMARTPTR_TYPEDEF(IHTMLTableCell, __uuidof(IHTMLTableCell));
_COM_SMARTPTR_TYPEDEF(IHTMLTableCol, __uuidof(IHTMLTableCol));
_COM_SMARTPTR_TYPEDEF(IHTMLTableRow, __uuidof(IHTMLTableRow));
_COM_SMARTPTR_TYPEDEF(IHTMLTableSection, __uuidof(IHTMLTableSection));
_COM_SMARTPTR_TYPEDEF(IHTMLTextAreaElement, __uuidof(IHTMLTextAreaElement));
_COM_SMARTPTR_TYPEDEF(IHTMLTextContainer, __uuidof(IHTMLTextContainer));
_COM_SMARTPTR_TYPEDEF(IHTMLTextElement, __uuidof(IHTMLTextElement));
_COM_SMARTPTR_TYPEDEF(IHTMLTitleElement, __uuidof(IHTMLTitleElement));
_COM_SMARTPTR_TYPEDEF(IHTMLTxtRange, __uuidof(IHTMLTxtRange));
_COM_SMARTPTR_TYPEDEF(IHTMLUListElement, __uuidof(IHTMLUListElement));
_COM_SMARTPTR_TYPEDEF(IHTMLUnknownElement, __uuidof(IHTMLUnknownElement));
_COM_SMARTPTR_TYPEDEF(IHTMLWindow2, __uuidof(IHTMLWindow2));
_COM_SMARTPTR_TYPEDEF(IHlink, __uuidof(IHlink));
_COM_SMARTPTR_TYPEDEF(IHlinkBrowseContext, __uuidof(IHlinkBrowseContext));
_COM_SMARTPTR_TYPEDEF(IHlinkFrame, __uuidof(IHlinkFrame));
_COM_SMARTPTR_TYPEDEF(IHlinkSite, __uuidof(IHlinkSite));
_COM_SMARTPTR_TYPEDEF(IHlinkTarget, __uuidof(IHlinkTarget));
_COM_SMARTPTR_TYPEDEF(IHttpNegotiate, __uuidof(IHttpNegotiate));
_COM_SMARTPTR_TYPEDEF(IHttpSecurity, __uuidof(IHttpSecurity));
_COM_SMARTPTR_TYPEDEF(IImageDecodeEventSink, __uuidof(IImageDecodeEventSink));
_COM_SMARTPTR_TYPEDEF(IImageDecodeFilter, __uuidof(IImageDecodeFilter));
_COM_SMARTPTR_TYPEDEF(IImgCtx, __uuidof(IImgCtx));
_COM_SMARTPTR_TYPEDEF(IInputObject, __uuidof(IInputObject));
_COM_SMARTPTR_TYPEDEF(IInputObjectSite, __uuidof(IInputObjectSite));
_COM_SMARTPTR_TYPEDEF(IInternet, __uuidof(IInternet));
_COM_SMARTPTR_TYPEDEF(IInternetBindInfo, __uuidof(IInternetBindInfo));
_COM_SMARTPTR_TYPEDEF(IInternetHostSecurityManager, __uuidof(IInternetHostSecurityManager));
_COM_SMARTPTR_TYPEDEF(IInternetPriority, __uuidof(IInternetPriority));
_COM_SMARTPTR_TYPEDEF(IInternetProtocol, __uuidof(IInternetProtocol));
_COM_SMARTPTR_TYPEDEF(IInternetProtocolInfo, __uuidof(IInternetProtocolInfo));
_COM_SMARTPTR_TYPEDEF(IInternetProtocolRoot, __uuidof(IInternetProtocolRoot));
_COM_SMARTPTR_TYPEDEF(IInternetProtocolSink, __uuidof(IInternetProtocolSink));
_COM_SMARTPTR_TYPEDEF(IInternetSecurityManager, __uuidof(IInternetSecurityManager));
_COM_SMARTPTR_TYPEDEF(IInternetSecurityMgrSite, __uuidof(IInternetSecurityMgrSite));
_COM_SMARTPTR_TYPEDEF(IInternetSession, __uuidof(IInternetSession));
_COM_SMARTPTR_TYPEDEF(IInternetThreadSwitch, __uuidof(IInternetThreadSwitch));
_COM_SMARTPTR_TYPEDEF(IInternetZoneManager, __uuidof(IInternetZoneManager));
_COM_SMARTPTR_TYPEDEF(ILayoutStorage, __uuidof(ILayoutStorage));
_COM_SMARTPTR_TYPEDEF(ILockBytes, __uuidof(ILockBytes));
_COM_SMARTPTR_TYPEDEF(IMLangCodePages, __uuidof(IMLangCodePages));
_COM_SMARTPTR_TYPEDEF(IMLangConvertCharset, __uuidof(IMLangConvertCharset));
_COM_SMARTPTR_TYPEDEF(IMLangFontLink, __uuidof(IMLangFontLink));
_COM_SMARTPTR_TYPEDEF(IMLangLineBreakConsole, __uuidof(IMLangLineBreakConsole));
_COM_SMARTPTR_TYPEDEF(IMLangString, __uuidof(IMLangString));
_COM_SMARTPTR_TYPEDEF(IMLangStringAStr, __uuidof(IMLangStringAStr));
_COM_SMARTPTR_TYPEDEF(IMLangStringBufA, __uuidof(IMLangStringBufA));
_COM_SMARTPTR_TYPEDEF(IMLangStringBufW, __uuidof(IMLangStringBufW));
_COM_SMARTPTR_TYPEDEF(IMLangStringWStr, __uuidof(IMLangStringWStr));
_COM_SMARTPTR_TYPEDEF(IMalloc, __uuidof(IMalloc));
_COM_SMARTPTR_TYPEDEF(IMallocSpy, __uuidof(IMallocSpy));
_COM_SMARTPTR_TYPEDEF(IMapMIMEToCLSID, __uuidof(IMapMIMEToCLSID));
_COM_SMARTPTR_TYPEDEF(IMarshal, __uuidof(IMarshal));
_COM_SMARTPTR_TYPEDEF(IMessageFilter, __uuidof(IMessageFilter));
_COM_SMARTPTR_TYPEDEF(IMimeInfo, __uuidof(IMimeInfo));
_COM_SMARTPTR_TYPEDEF(IMoniker, __uuidof(IMoniker));
_COM_SMARTPTR_TYPEDEF(IMultiLanguage, __uuidof(IMultiLanguage));
_COM_SMARTPTR_TYPEDEF(IMultiQI, __uuidof(IMultiQI));
_COM_SMARTPTR_TYPEDEF(INewShortcutHookA, __uuidof(INewShortcutHookA));
_COM_SMARTPTR_TYPEDEF(INewShortcutHookW, __uuidof(INewShortcutHookW));
_COM_SMARTPTR_TYPEDEF(IObjectIdentity, __uuidof(IObjectIdentity));
_COM_SMARTPTR_TYPEDEF(IObjectSafety, __uuidof(IObjectSafety));
_COM_SMARTPTR_TYPEDEF(IObjectWithSite, __uuidof(IObjectWithSite));
_COM_SMARTPTR_TYPEDEF(IOleAdviseHolder, __uuidof(IOleAdviseHolder));
_COM_SMARTPTR_TYPEDEF(IOleCache, __uuidof(IOleCache));
_COM_SMARTPTR_TYPEDEF(IOleCache2, __uuidof(IOleCache2));
_COM_SMARTPTR_TYPEDEF(IOleCacheControl, __uuidof(IOleCacheControl));
_COM_SMARTPTR_TYPEDEF(IOleClientSite, __uuidof(IOleClientSite));
_COM_SMARTPTR_TYPEDEF(IOleCommandTarget, __uuidof(IOleCommandTarget));
_COM_SMARTPTR_TYPEDEF(IOleContainer, __uuidof(IOleContainer));
_COM_SMARTPTR_TYPEDEF(IOleControl, __uuidof(IOleControl));
_COM_SMARTPTR_TYPEDEF(IOleControlSite, __uuidof(IOleControlSite));
_COM_SMARTPTR_TYPEDEF(IOleDocument, __uuidof(IOleDocument));
_COM_SMARTPTR_TYPEDEF(IOleDocumentSite, __uuidof(IOleDocumentSite));
_COM_SMARTPTR_TYPEDEF(IOleDocumentView, __uuidof(IOleDocumentView));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceActiveObject, __uuidof(IOleInPlaceActiveObject));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceFrame, __uuidof(IOleInPlaceFrame));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceObject, __uuidof(IOleInPlaceObject));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceObjectWindowless, __uuidof(IOleInPlaceObjectWindowless));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceSite, __uuidof(IOleInPlaceSite));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceSiteEx, __uuidof(IOleInPlaceSiteEx));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceSiteWindowless, __uuidof(IOleInPlaceSiteWindowless));
_COM_SMARTPTR_TYPEDEF(IOleInPlaceUIWindow, __uuidof(IOleInPlaceUIWindow));
_COM_SMARTPTR_TYPEDEF(IOleItemContainer, __uuidof(IOleItemContainer));
_COM_SMARTPTR_TYPEDEF(IOleLink, __uuidof(IOleLink));
_COM_SMARTPTR_TYPEDEF(IOleObject, __uuidof(IOleObject));
_COM_SMARTPTR_TYPEDEF(IOleParentUndoUnit, __uuidof(IOleParentUndoUnit));
_COM_SMARTPTR_TYPEDEF(IOleUndoManager, __uuidof(IOleUndoManager));
_COM_SMARTPTR_TYPEDEF(IOleUndoUnit, __uuidof(IOleUndoUnit));
_COM_SMARTPTR_TYPEDEF(IOleWindow, __uuidof(IOleWindow));
_COM_SMARTPTR_TYPEDEF(IOmHistory, __uuidof(IOmHistory));
_COM_SMARTPTR_TYPEDEF(IOmNavigator, __uuidof(IOmNavigator));
_COM_SMARTPTR_TYPEDEF(IPSFactoryBuffer, __uuidof(IPSFactoryBuffer));
_COM_SMARTPTR_TYPEDEF(IParseDisplayName, __uuidof(IParseDisplayName));
_COM_SMARTPTR_TYPEDEF(IPerPropertyBrowsing, __uuidof(IPerPropertyBrowsing));
_COM_SMARTPTR_TYPEDEF(IPersist, __uuidof(IPersist));
_COM_SMARTPTR_TYPEDEF(IPersistFile, __uuidof(IPersistFile));
_COM_SMARTPTR_TYPEDEF(IPersistFolder, __uuidof(IPersistFolder));
_COM_SMARTPTR_TYPEDEF(IPersistFolder2, __uuidof(IPersistFolder2));
_COM_SMARTPTR_TYPEDEF(IPersistHistory, __uuidof(IPersistHistory));
_COM_SMARTPTR_TYPEDEF(IPersistMemory, __uuidof(IPersistMemory));
_COM_SMARTPTR_TYPEDEF(IPersistMoniker, __uuidof(IPersistMoniker));
_COM_SMARTPTR_TYPEDEF(IPersistPropertyBag, __uuidof(IPersistPropertyBag));
_COM_SMARTPTR_TYPEDEF(IPersistPropertyBag2, __uuidof(IPersistPropertyBag2));
_COM_SMARTPTR_TYPEDEF(IPersistStorage, __uuidof(IPersistStorage));
_COM_SMARTPTR_TYPEDEF(IPersistStream, __uuidof(IPersistStream));
_COM_SMARTPTR_TYPEDEF(IPersistStreamInit, __uuidof(IPersistStreamInit));
_COM_SMARTPTR_TYPEDEF(IPicture, __uuidof(IPicture));
_COM_SMARTPTR_TYPEDEF(IPictureDisp, __uuidof(IPictureDisp));
_COM_SMARTPTR_TYPEDEF(IPointerInactive, __uuidof(IPointerInactive));
_COM_SMARTPTR_TYPEDEF(IPrint, __uuidof(IPrint));
_COM_SMARTPTR_TYPEDEF(IProgressNotify, __uuidof(IProgressNotify));
_COM_SMARTPTR_TYPEDEF(IPropertyBag, __uuidof(IPropertyBag));
_COM_SMARTPTR_TYPEDEF(IPropertyBag2, __uuidof(IPropertyBag2));
_COM_SMARTPTR_TYPEDEF(IPropertyNotifySink, __uuidof(IPropertyNotifySink));
_COM_SMARTPTR_TYPEDEF(IPropertyPage, __uuidof(IPropertyPage));
_COM_SMARTPTR_TYPEDEF(IPropertyPage2, __uuidof(IPropertyPage2));
_COM_SMARTPTR_TYPEDEF(IPropertyPageSite, __uuidof(IPropertyPageSite));
_COM_SMARTPTR_TYPEDEF(IPropertySetStorage, __uuidof(IPropertySetStorage));
_COM_SMARTPTR_TYPEDEF(IPropertyStorage, __uuidof(IPropertyStorage));
_COM_SMARTPTR_TYPEDEF(IProvideClassInfo, __uuidof(IProvideClassInfo));
_COM_SMARTPTR_TYPEDEF(IProvideClassInfo2, __uuidof(IProvideClassInfo2));
_COM_SMARTPTR_TYPEDEF(IProvideMultipleClassInfo, __uuidof(IProvideMultipleClassInfo));
_COM_SMARTPTR_TYPEDEF(IQueryInfo, __uuidof(IQueryInfo));
_COM_SMARTPTR_TYPEDEF(IQuickActivate, __uuidof(IQuickActivate));
_COM_SMARTPTR_TYPEDEF(IROTData, __uuidof(IROTData));
_COM_SMARTPTR_TYPEDEF(IRecordInfo, __uuidof(IRecordInfo));
_COM_SMARTPTR_TYPEDEF(IRichEditOle, __uuidof(IRichEditOle));
_COM_SMARTPTR_TYPEDEF(IRichEditOleCallback, __uuidof(IRichEditOleCallback));
_COM_SMARTPTR_TYPEDEF(IRootStorage, __uuidof(IRootStorage));
_COM_SMARTPTR_TYPEDEF(IRpcChannelBuffer, __uuidof(IRpcChannelBuffer));
_COM_SMARTPTR_TYPEDEF(IRpcChannelBuffer2, __uuidof(IRpcChannelBuffer2));
_COM_SMARTPTR_TYPEDEF(IRpcChannelBuffer3, __uuidof(IRpcChannelBuffer3));
_COM_SMARTPTR_TYPEDEF(IRpcProxyBuffer, __uuidof(IRpcProxyBuffer));
_COM_SMARTPTR_TYPEDEF(IRpcStubBuffer, __uuidof(IRpcStubBuffer));
_COM_SMARTPTR_TYPEDEF(IRunnableObject, __uuidof(IRunnableObject));
_COM_SMARTPTR_TYPEDEF(IRunningObjectTable, __uuidof(IRunningObjectTable));
_COM_SMARTPTR_TYPEDEF(ISequentialStream, __uuidof(ISequentialStream));
_COM_SMARTPTR_TYPEDEF(IServerSecurity, __uuidof(IServerSecurity));
_COM_SMARTPTR_TYPEDEF(IServiceProvider, __uuidof(IServiceProvider));
_COM_SMARTPTR_TYPEDEF(IShellBrowser, __uuidof(IShellBrowser));
_COM_SMARTPTR_TYPEDEF(IShellDispatch, __uuidof(IShellDispatch));
_COM_SMARTPTR_TYPEDEF(IShellExecuteHookA, __uuidof(IShellExecuteHookA));
_COM_SMARTPTR_TYPEDEF(IShellExecuteHookW, __uuidof(IShellExecuteHookW));
_COM_SMARTPTR_TYPEDEF(IShellExtInit, __uuidof(IShellExtInit));
_COM_SMARTPTR_TYPEDEF(IShellFolder, __uuidof(IShellFolder));
_COM_SMARTPTR_TYPEDEF(IShellFolderViewDual, __uuidof(IShellFolderViewDual));
_COM_SMARTPTR_TYPEDEF(IShellIcon, __uuidof(IShellIcon));
_COM_SMARTPTR_TYPEDEF(IShellIconOverlay, __uuidof(IShellIconOverlay));
_COM_SMARTPTR_TYPEDEF(IShellIconOverlayIdentifier, __uuidof(IShellIconOverlayIdentifier));
_COM_SMARTPTR_TYPEDEF(IShellLinkA, __uuidof(IShellLinkA));
_COM_SMARTPTR_TYPEDEF(IShellLinkDual, __uuidof(IShellLinkDual));
_COM_SMARTPTR_TYPEDEF(IShellLinkW, __uuidof(IShellLinkW));
_COM_SMARTPTR_TYPEDEF(IShellPropSheetExt, __uuidof(IShellPropSheetExt));
_COM_SMARTPTR_TYPEDEF(IShellUIHelper, __uuidof(IShellUIHelper));
_COM_SMARTPTR_TYPEDEF(IShellView, __uuidof(IShellView));
_COM_SMARTPTR_TYPEDEF(IShellView2, __uuidof(IShellView2));
_COM_SMARTPTR_TYPEDEF(IShellWindows, __uuidof(IShellWindows));
_COM_SMARTPTR_TYPEDEF(ISimpleFrameSite, __uuidof(ISimpleFrameSite));
_COM_SMARTPTR_TYPEDEF(ISoftDistExt, __uuidof(ISoftDistExt));
_COM_SMARTPTR_TYPEDEF(ISpecifyPropertyPages, __uuidof(ISpecifyPropertyPages));
_COM_SMARTPTR_TYPEDEF(IStdMarshalInfo, __uuidof(IStdMarshalInfo));
_COM_SMARTPTR_TYPEDEF(IStorage, __uuidof(IStorage));
_COM_SMARTPTR_TYPEDEF(IStream, __uuidof(IStream));
_COM_SMARTPTR_TYPEDEF(ISubscriptionMgr, __uuidof(ISubscriptionMgr));
_COM_SMARTPTR_TYPEDEF(ISupportErrorInfo, __uuidof(ISupportErrorInfo));
_COM_SMARTPTR_TYPEDEF(ISurrogate, __uuidof(ISurrogate));
_COM_SMARTPTR_TYPEDEF(ISynchronize, __uuidof(ISynchronize));
_COM_SMARTPTR_TYPEDEF(ISynchronizeEvent, __uuidof(ISynchronizeEvent));
_COM_SMARTPTR_TYPEDEF(ISynchronizeMutex, __uuidof(ISynchronizeMutex));
_COM_SMARTPTR_TYPEDEF(ITimer, __uuidof(ITimer));
_COM_SMARTPTR_TYPEDEF(ITimerService, __uuidof(ITimerService));
_COM_SMARTPTR_TYPEDEF(ITimerSink, __uuidof(ITimerSink));
_COM_SMARTPTR_TYPEDEF(ITypeChangeEvents, __uuidof(ITypeChangeEvents));
_COM_SMARTPTR_TYPEDEF(ITypeComp, __uuidof(ITypeComp));
_COM_SMARTPTR_TYPEDEF(ITypeFactory, __uuidof(ITypeFactory));
_COM_SMARTPTR_TYPEDEF(ITypeInfo, __uuidof(ITypeInfo));
_COM_SMARTPTR_TYPEDEF(ITypeInfo2, __uuidof(ITypeInfo2));
_COM_SMARTPTR_TYPEDEF(ITypeLib, __uuidof(ITypeLib));
_COM_SMARTPTR_TYPEDEF(ITypeLib2, __uuidof(ITypeLib2));
_COM_SMARTPTR_TYPEDEF(ITypeMarshal, __uuidof(ITypeMarshal));
_COM_SMARTPTR_TYPEDEF(IURLSearchHook, __uuidof(IURLSearchHook));
_COM_SMARTPTR_TYPEDEF(IUniformResourceLocatorA, __uuidof(IUniformResourceLocatorA));
_COM_SMARTPTR_TYPEDEF(IUniformResourceLocatorW, __uuidof(IUniformResourceLocatorW));
_COM_SMARTPTR_TYPEDEF(IUnknown, __uuidof(IUnknown));
_COM_SMARTPTR_TYPEDEF(IUrlHistoryNotify, __uuidof(IUrlHistoryNotify));
_COM_SMARTPTR_TYPEDEF(IUrlHistoryStg, __uuidof(IUrlHistoryStg));
_COM_SMARTPTR_TYPEDEF(IUrlHistoryStg2, __uuidof(IUrlHistoryStg2));
_COM_SMARTPTR_TYPEDEF(IUrlMon, __uuidof(IUrlMon));
_COM_SMARTPTR_TYPEDEF(IVariantChangeType, __uuidof(IVariantChangeType));
_COM_SMARTPTR_TYPEDEF(IViewFilterSite, __uuidof(IViewFilterSite));
_COM_SMARTPTR_TYPEDEF(IViewObject, __uuidof(IViewObject));
_COM_SMARTPTR_TYPEDEF(IViewObject2, __uuidof(IViewObject2));
_COM_SMARTPTR_TYPEDEF(IViewObjectEx, __uuidof(IViewObjectEx));
_COM_SMARTPTR_TYPEDEF(IViewTransition, __uuidof(IViewTransition));
_COM_SMARTPTR_TYPEDEF(IViewTransitionSite, __uuidof(IViewTransitionSite));
_COM_SMARTPTR_TYPEDEF(IWaitMultiple, __uuidof(IWaitMultiple));
_COM_SMARTPTR_TYPEDEF(IWebBrowser, __uuidof(IWebBrowser));
_COM_SMARTPTR_TYPEDEF(IWebBrowser2, __uuidof(IWebBrowser2));
_COM_SMARTPTR_TYPEDEF(IWebBrowserApp, __uuidof(IWebBrowserApp));
_COM_SMARTPTR_TYPEDEF(IWinInetHttpInfo, __uuidof(IWinInetHttpInfo));
_COM_SMARTPTR_TYPEDEF(IWinInetInfo, __uuidof(IWinInetInfo));
_COM_SMARTPTR_TYPEDEF(IWindowForBindingUI, __uuidof(IWindowForBindingUI));
_COM_SMARTPTR_TYPEDEF(IXMLDocument, __uuidof(IXMLDocument));
_COM_SMARTPTR_TYPEDEF(IXMLElement, __uuidof(IXMLElement));
_COM_SMARTPTR_TYPEDEF(IXMLElementCollection, __uuidof(IXMLElementCollection));
_COM_SMARTPTR_TYPEDEF(IXMLElementNotificationSink, __uuidof(IXMLElementNotificationSink));
_COM_SMARTPTR_TYPEDEF(IXMLError, __uuidof(IXMLError));
_COM_SMARTPTR_TYPEDEF(OLEDBSimpleProvider, __uuidof(OLEDBSimpleProvider));
_COM_SMARTPTR_TYPEDEF(OLEDBSimpleProviderListener, __uuidof(OLEDBSimpleProviderListener));

а что там непонятного? определяет умные указатели, притом это "стандартно" и "общепринято". В чем проблемы-то?

ЗЫ: по теме: есть сайт http://govnokod.ru/ (не сочтите за рекламу) - смотрите его)

Автор: ДокторТуамОсес 22.6.2009, 22:42
Цитата(azesmcar @  22.6.2009,  10:28 Найти цитируемый пост)
Какой еще оратор? Или это цитата? Тогда откуда? 

Вот отсюда 
Цитата(ДокторТуамОсес @  21.6.2009,  23:00 Найти цитируемый пост)
[6, стр.7]

В сообщение же было указано откуда цитата. А где находится список литературы - указано в моей подписи

Автор: azesmcar 23.6.2009, 08:36
Цитата(ДокторТуамОсес @  22.6.2009,  22:42 Найти цитируемый пост)
[6, стр.7]

замечательно...7-ая страница. Или 6-ая? Интересно 7-ая странице "чего?" На 7-ой странице данного топика (да и на 6-ой тоже) я такого оратора не нашел.

Цитата(ДокторТуамОсес @  22.6.2009,  22:42 Найти цитируемый пост)
А где находится список литературы - указано в моей подписи 

А из нашего окна площадь Красная видна.
зачем мне список литературы? smile 
Хотя я понимаю ваше бурное и непреодолимое желание повысить посещаемость своего ресурса.

Автор: kosmonaFFFt 23.6.2009, 09:31
список литературы тут при том, что цитата из книги, не помнб правда названия...

Автор: azesmcar 23.6.2009, 09:36
Цитата(kosmonaFFFt @  23.6.2009,  09:31 Найти цитируемый пост)
список литературы тут при том, что цитата из книги, не помнб правда названия... 

Ах да, наверное я их должен был всех перечитать и наизусть запомнить. 

Автор: ДокторТуамОсес 23.6.2009, 17:53
Цитата(kosmonaFFFt @  23.6.2009,  09:31 Найти цитируемый пост)
список литературы тут при том, что цитата из книги, не помнб правда названия... 

Дык я не понял. Вы посмотрели список литературы или нет?

Добавлено через 2 минуты и 3 секунды
Цитата(azesmcar @  23.6.2009,  08:36 Найти цитируемый пост)
Хотя я понимаю ваше бурное и непреодолимое желание повысить посещаемость своего ресурса. 

А вот я смысл Вашего "выпада" не понимаю.
Вас что не устраивает-то?
То что когда я кого-то цитирую, то привожу данные того,  кого я цитирую?

Автор: azesmcar 23.6.2009, 18:50
Цитата(ДокторТуамОсес @  23.6.2009,  17:53 Найти цитируемый пост)
А вот я смысл Вашего "выпада" не понимаю.
Вас что не устраивает-то?
То что когда я кого-то цитирую, то привожу данные того,  кого я цитирую?


Смысл моих "слов" в том, что если вы кого-то цитируете - сообщите кого, а не указывайте страницу в книге, которая описана на другом сайте. Возможно у меня нет ни малейшего желания посещать другой ресурс и там копатся в ссылках. Пишите что-то здесь? - так пишите до конца, уже не в первый раз замечаю за вами сообщения типа: посмотрите мой вопрос тут. А это наводит на мысль, которую я кстати и высказал.

Автор: jonie 23.6.2009, 20:32
кстати еще одно "но" отсюда : не нужно в коде писать комменты вроде "чтобы понять что это, посмотрите в функции foo класса bar в строке 24"....)

Автор: zim22 24.6.2009, 18:41
 smile 
Цитата(azesmcar @  23.6.2009,  08:36 Найти цитируемый пост)
Хотя я понимаю ваше бурное и непреодолимое желание повысить посещаемость своего ресурса.

зря вы все гоните на ДокторТуамОсес'а. 
он уже "пол-книжки" Подбельского откритиковал smile

http://doctortuamoses.0pk.ru/viewtopic.php?id=117
(красненьким шрифтом - его уточнения)

Автор: Alca 24.6.2009, 19:14
Цитата

http://doctortuamoses.0pk.ru/viewtopic.php?id=117

 smile 

Автор: azesmcar 24.6.2009, 19:24
Цитата(zim22 @  24.6.2009,  18:41 Найти цитируемый пост)
зря вы все гоните на ДокторТуамОсес'а. 
он уже "пол-книжки" Подбельского откритиковал smile

Да ради бога, пусть хоть Саттера критикует, только не надо в разговоре расчитывать на то, что я все это читал (или буду читать) smile 

Автор: zim22 25.6.2009, 08:45
Цитата(azesmcar @  24.6.2009,  19:24 Найти цитируемый пост)
Да ради бога, пусть хоть Саттера критикует,

вы пол жизни потеряли. его критика - это нечто! советую посмотреть  smile 
***
ДокторТуамОсес, в плане посещаемости сайт у вас ни ахти.
я вчера в 9 утра http://doctortuamoses.0pk.ru/viewtopic.php?id=170 запостил. прошло 24 часа. никто в неё даже не зашёл... сколько мне с ответом ждать? smile

Автор: azesmcar 25.6.2009, 08:48
Цитата(zim22 @  25.6.2009,  08:45 Найти цитируемый пост)
вы пол жизни потеряли. его критика - это нечто! советую посмотреть  smile  

иду смотреть smile 

Автор: JackYF 25.6.2009, 18:36
ДокторТуамОсес, спасибо, посмеялся.

В частности, http://doctortuamoses.0pk.ru/uploads/0004/6c/9e/390-1-f.jpg, замечание про "\r" и "\n" в корне неверно.


M
JackYF
В общем, не удивляйтесь, теперь ссылки на Ваш форум будут удаляться.


А ссылки выше в этой теме будут оставлены для того, чтобы у других участников не возникало вопросов "почему?".

Автор: zim22 25.6.2009, 21:50
 smile 
Цитата(JackYF @  25.6.2009,  18:36 Найти цитируемый пост)
JackYFВ общем, не удивляйтесь, теперь ссылки на Ваш форум будут удаляться.

шепчу на ухо: у него в подписи ссылки на форум остались
smile

Автор: ДокторТуамОсес 26.6.2009, 14:39
Цитата(zim22 @  25.6.2009,  08:45 Найти цитируемый пост)
ДокторТуамОсес, в плане посещаемости сайт у вас ни ахти.

Ничего. Через годик-два раскрутиться. Все когда-то начинали с малого.


Цитата(zim22 @  25.6.2009,  08:45 Найти цитируемый пост)
сколько мне с ответом ждать?

Говорят, что "обещанного 3 года ждут"©  smile 
P.S. Ответил  smile 

Автор: MasterOfMuppets 29.3.2010, 09:16
Одногруппник отжог. Прислал код лабы по ОС... долго ржал. Даже не удосужился поставить какой-нибудь линукс на виртуальную машину, чтобы его откомпилить - результат: (как есть, ничего не менял)
Код

#include "stdio.h"
#include "string.h"
#define _CRT_NONSTDC_NO_DEPRECATE
int main (int argc, char*argv[], char*envp[]){
  
 if (argc>1){
    if ((strcmp(argv[1],"help"))){
        if (argc==2){
        printf("Uncorectly vairebals\n");
        printf("If you need help for this programm please, the next time wrote 'help'\n");
        return -1;
        }
        else{
        printf("Eta programma vivodit na ekran spisok fijlov \n");
        printf("Naprimer: ' /home/nam'\n");
        return -1;
        }
    }
    else{
        FILE* f;
        f=fopen(argv[2],"t");
int pid=fork();
    if (pid<0) {
      printf("error!");
      return;
    }
    else {
      if (pid==0){
         if (argc==2) (void) execle ("/bin/ls","/bin/ls",argv[1],0,envp);
     else {
        (void) execle ("usr/bin/ls/help","/usr/bin/ls/help","frg","help",0,envp);
        printf("komanda ls vivodit na ekran spisok fijlov, raspologennix po ykazannomy puti");
      }
    }
  return;
}


Начнём с дифайна - ну не научили чувака, что эта хрень нужна только для визуал студии)) Как на первой лекции по С научили 2 года назад, так и юзает везде как ритуал smile
далее, смесь транслита и ломаного английского сразила просто наповал!
Так же осталось загадкой, зачем открывался файл...

Задание было - создать новый процесс, и в нём запустить /bin/ls с параметрами, передаваемыми в командной строке, и предусмотреть простенький хелп... Ну неужели так трудно...

Автор: Earnest 30.7.2010, 07:33
Внимание! Хвост темы с базаром про ООП\не ООП перенесен в религиозные войны. Ругайтесь там, если охота. А здесь прошу высказываться по теме, если есть что сказать. Все прочее будет удаляться без предупреждения.

Автор: Randajad 18.3.2012, 12:17
Очень интересное мнение участников про malloc.

Код

#define ARRAY_BUF_SIZE 8


template<typename T>
inline T *nalloc(u32 size, T **p = 0) {
    size *= sizeof(T);

    if(p)
        return *p = (T *)nedalloc::nedrealloc(*p, size);
    return (T *)nedalloc::nedrealloc(0, size);
}

inline void nfree(void *p) {
    nedalloc::nedfree(p);
}

template<typename T>
class array {
public:
    inline array() : len(0), arr(0), real_len(0) {}

    inline ~array() {
        while(len--)
            arr[len].~T();
    }

    inline void resize(u32 nlen) {
        if(len < nlen) {
            if(arr == 0 || real_len < nlen)
                nalloc(real_len = nlen + ARRAY_BUF_SIZE, &arr);

            for(; len != nlen; len++)
                new(arr + len) T;

            return;
        }

        for(; len != nlen; len--)
            arr[len].~T();

        if(len || !arr)
            return;

        nfree(arr);

        arr = 0;
        real_len = 0;
    }

    inline T &operator[](u32 idx) const {
        return arr[idx];
    }

    inline array<T> &operator=(const array<T> &a) {
        resize(a.len, true);

        for(u32 idx = len; idx--; )
            arr[idx] = a.arr[idx];
        return *this;
    }

    template<typename F>
    inline void sort(F f) {
        qsort(arr, len, sizeof(T), f);
    }

    inline void clear() {
        resize(0);
    }

    inline void pop() {
        erase(len - 1);
    }

    inline T *getp() {
        return &get();
    }

    inline T &get() {
        resize(len + 1);
        return arr[len - 1];
    }

    inline T &push(T &t) {
        T &ret = get();
        return ret = t;
    }

    inline T &push(T *t) {
        T &ret = get();
        return ret = *t;
    }

    inline T &push(T t) {
        T &ret = get();
        return ret = t;
    }

    inline void erase(T *t) {
        erase(t - arr);
    }

    inline void erase(T t) {
        for(T *cur = arr, *end = arr + len; cur != end; cur++)
            if(*cur == t) {
                erase(cur);
                return;
            }
    }

    inline void erase(u32 idx) {
        arr[idx].~T();

        if(idx == --len)
            return;
        memmove(arr + idx, arr + idx + 1, (len - idx) * sizeof(T));
    }

    u32 len;
private:
    T *arr;

    u32 real_len;
    inline array<T>(const array<T> &);
};


А что участники думают по поводу этого?
std::vector для классов, которые внутри себя выделяют память не подходит, потому что вектор все время переконструирует и вызывает оператор=(), когда закончилось место в буффере/удаляют элемент из середины массива; это все дико тормозит.

Кстати. Еще в правила: не нужно использовать NULL. Это макрос и он задефайнен где-то там. Лучше 0. Или, с выходом С++0х можно еще nullptr.

Автор: Фантом 18.3.2012, 13:36
Цитата(Randajad @  18.3.2012,  13:17 Найти цитируемый пост)

А что участники думают по поводу этого?

Код на C++, в котором в первой же строке константа определяется макросом... что тут еще можно думать?  smile 

Автор: Randajad 18.3.2012, 18:13
И что же вы находите такого плохого в дефайнах препроцессора? smile

Автор: bsa 19.3.2012, 13:18
А что тут думать? Вопрос находится в теме "как не надо писать код". Ответ очевиден.  smile 
Самый быстрый доступ к элементам в векторе. Самое быстрое удаление/вставка в середину в списке.
Если тебе не нужен случайный доступ, а достаточно последовательного, то лучше выбрать список.
Если тебе необходим случайный доступ, а размер элементов не больше указателя, то быстрее вектора вряд ли что будет.
Если ты используешь большие массивы больших элементов и случайный доступ необходим, то можно сделать нечто среднее, между списком и вектором. Т.е. в списке у тебя хранятся сами элементы, а в векторе хранятся указатели на них. Таким образом, при добавлении/удалении элементов, вектор будет работать только с простыми указателями (это быстро), а список с элементами. Пример такого контейнера - QList (Qt).

Автор: Randajad 25.3.2012, 17:45
Это все хорошо, но необходим также доступ к элементам в стиле обычного массива. smile
Так что увы, ничего подходящего не нашел, кроме как самописный вариант.

Автор: bsa 26.3.2012, 17:51
Цитата(Randajad @  25.3.2012,  18:45 Найти цитируемый пост)
Это все хорошо, но необходим также доступ к элементам в стиле обычного массива.

Цитата
Если ты используешь большие массивы больших элементов и случайный доступ необходим, то можно сделать нечто среднее, между списком и вектором. Т.е. в списке у тебя хранятся сами элементы, а в векторе хранятся указатели на них. Таким образом, при добавлении/удалении элементов, вектор будет работать только с простыми указателями (это быстро), а список с элементами. Пример такого контейнера - QList (Qt). 

Автор: Randajad 27.3.2012, 08:40
Я имел ввиду чтобы:
array<int> arr;
Было равно int arr[];
И все элементы стояли друг за другом в одном куске памяти. smile

Автор: baldina 27.3.2012, 10:26
Цитата(Randajad @  18.3.2012,  12:17 Найти цитируемый пост)
 вектор все время переконструирует и вызывает оператор=()

если у объекта тривиальный конструктор/деструктор накладных немного. если нетривиальный, объект (или объекты с ним связанные) может быть обескуражен неожиданной сменой адреса. так что именно vector подходит "для классов, которые внутри себя выделяют память".
память кстати по-разному выделять можно. скажем, копирование при записи. так что это скорее проблема класса-содержимого, а не контейнера.
желание иметь элементы в памяти "одним куском", причем именно элементы, а не указатели законно, но не понятно. приведите пример, когда это действительно необходимо. мне в голову приходит только работа с низкоуровневыми библиотеками, но они в основном работают с элементарными типами данных, для которых перемещение в vector реализовано как раз через memmove. кстати. никто не мешает вам сделать свою специализацию класса vector.

Автор: Randajad 14.4.2012, 17:42
Объекты внутри себя не хранят ссылок друг на друга, в этом вся фишка.
Выделение через new памяти для каждого объекта не хорошая идея потому, что размер объекта маленький, а их число порядка десятков тысяч. Таким образом из-за выравнивания и данных менеджера памяти получится слишком большое количество памяти "впустую".

Автор: baldina 14.4.2012, 21:44
Цитата

Тони Хоар впервые произнёс, а Дональд Кнут впоследствии часто повторял известное высказывание: «Преждевременная оптимизация — это корень всех бед»

Автор: heavix 15.5.2012, 11:31
Цитата

     11. Функции принимающие 10 (да-да, 10) параметров.


10?)) Это еще ничего))) Вот сейчас у меня проект, в котором есть функция принимающая 43 параметра, причем одного типа mxArray... Корень всех бед проекта...
И самое паршивое что я сделать ничего не могу, т.к эта функция дергается из длл-ки написанной в матлабе( А математику делаю не я... Вот и наступает вынос мозга когда человек делающий мат часть начинает требовать передачи параметров номер 3,9,12 как uint8, 14,16 как стринг... но все нуно конвертить в mxArray ))   

Автор: ТарасАтавин 29.8.2013, 18:44
Цитата(chipset @  18.3.2006,  07:09 Найти цитируемый пост)
11. Функции принимающие 10 (да-да, 10) параметров.
А почему так мало? Уж если автор идиот, то должна быть пара тысяч.

Добавлено @ 18:51
Цитата(Ignat @  18.3.2006,  12:38 Найти цитируемый пост)
Ну это я сильно поскромничал, 1000 строк - это только та часть, с которой я работаю, даже, наверное 1500-2000 будет точнее,
Тысяч 30 - это то, что читается в оперативу и анализируется на диване. А жалкие две и хорошим то стилем стоит брать чужие в единственном случае - если писаны наставником/преподавателем/автором книги, которую можно рекомендовать на роль учебника. И только за образец. Потому что их быстрее переписать, не заглядывая, чем пристроить. Этот объём - не тот случай, когда оправдано разделение труда в команде.

Добавлено @ 18:59
Цитата(UnrealMan @  30.3.2006,  14:26 Найти цитируемый пост)
А чем собс-но плох malloc? В случае, когда используются нетривиальные объекты (с конструктором, деструктором), и требуется перевыделение памяти с сохранением данных (realloc), использование new и delete – явно не самое удачное решение. 
Как раз единственно допустимое. Маллок/реаалок - это для скаляров. 

Автор: ТарасАтавин 29.8.2013, 19:07
Самое веселое - это писать вообще без отсупов, а на плюсах так ещё и всё в одну строку.

Добавлено через 1 минуту и 11 секунд
Вот ещё пособие, как делать не надо: 
Код
int factorial(int x)
{
 return factorial(x-1)*x;
}


Добавлено через 4 минуты и 1 секунду
И поминавшийся здесь явный вызов конструктора. Конструктор и деструктор придуманы именно для того, чтоб вызываться автоматически, чтоб уж точно не забыть из вызвать и, наоборот, не забыть, что уже вызвал.

Автор: ТарасАтавин 30.8.2013, 04:58
Рекурсия бывает оправдана при обработке рекурсивных данных, например, деревьев. Но рекурсия на пустом месте - это именно то, чего делать не надо.

Автор: Jeka178RUS 2.9.2013, 13:00
Чем же рекурсия так плоха? Накладные расходы на вызов функции, как мне кажется, не существенны (не берем в расчет критические отрасли, как контроллеры и пр.). Разве что отладка не удобна

Автор: bsa 2.9.2013, 15:01
Цитата(ТарасАтавин @  29.8.2013,  20:07 Найти цитируемый пост)
И поминавшийся здесь явный вызов конструктора. Конструктор и деструктор придуманы именно для того, чтоб вызываться автоматически, чтоб уж точно не забыть из вызвать и, наоборот, не забыть, что уже вызвал.
ну если ты не знаешь, зачем нужна возможность ручного вызова конструктора и деструктора, то это не значит, что никому это не нужно. Хинт: попробуй реализовать std::vector::reserve() со всеми побочными явлениями без использования прямых вызовов.
Цитата(ТарасАтавин @  30.8.2013,  05:58 Найти цитируемый пост)
Но рекурсия на пустом месте - это именно то, чего делать не надо. 
рекурсию на пустом месте делают только преподаватели. Сам программист редко когда делает рекурсию там, где и без нее все хорошо получается.

Автор: ТарасАтавин 3.9.2013, 05:45
Цитата(bsa @  2.9.2013,  15:01 Найти цитируемый пост)
рекурсию на пустом месте делают только преподаватели.
Преподаватели этим занимаются при подаче нового материала по теме "рекурсия", чтоб показать, что это вообще такое. Но когда ею пестрят учебные поделухи, это нормально. В реальных же прогах рекурсия должна быть там и только там, где она вытекает или из задачи, или из представления данных. Да и то бывает, что вместо рекурсии надо обратиться к математику, который объяснит, что матрицу экономнее привести к треугольному виду, а потом перемножить главную диагональ, чем считать определитель рекурсивным алгоритмом. На КМК есть целый отдел любителей рекурсии.

Добавлено @ 05:53
Цитата(Jeka178RUS @  2.9.2013,  13:00 Найти цитируемый пост)
Чем же рекурсия так плоха? Накладные расходы на вызов функции, как мне кажется, не существенны (не берем в расчет критические отрасли, как контроллеры и пр.). Разве что отладка не удобна 
Один вызов? Или много? Кроме того, они зависят от параметров, при всего лишь одном тяжёлом параметре типа двумерный массив памяти при рекурсивном вычислении определителя хватило всего на 1237 вызовов на 6-ти уровнях. Да и не в расходах на вызов обычно дело. В случае, например, факториала рекурсия соответствует двум циклам вызовов и возвратов вместо одного.

Добавлено @ 05:56
Цитата(bsa @  2.9.2013,  15:01 Найти цитируемый пост)
ну если ты не знаешь, зачем нужна возможность ручного вызова конструктора и деструктора, то это не значит, что никому это не нужно. Хинт: попробуй реализовать std::vector::reserve() со всеми побочными явлениями без использования прямых вызовов.
 Явный вызов конструктора отлично заменяется присваиванием вспомогательного локального объекта, в котором напутать уже нельзя. А вот к чему приведёт двойной вызов конструктора для одного и того же динамического объёкта по указателю без тестов не разберёт и сам Страуструп.

Автор: bsa 3.9.2013, 10:30
Цитата(ТарасАтавин @  3.9.2013,  06:45 Найти цитируемый пост)
 Явный вызов конструктора отлично заменяется присваиванием вспомогательного локального объекта, в котором напутать уже нельзя.
ну ну. А если еще раз подумать? Хинт: как поведет себя оператор присваивания с неинициализированным объектом?

Цитата(ТарасАтавин @  3.9.2013,  06:45 Найти цитируемый пост)
А вот к чему приведёт двойной вызов конструктора для одного и того же динамического объёкта по указателю без тестов не разберёт и сам Страуструп.
У меня такой вопрос, а нахрена вызывать конструктор два раза? Ты вообще знаешь, как он вызывается? Или ты путаешь вызов конструктора с созданием объекта?

и вообще. Языки С/С++ очень гибкие. Поэтому на них очень легко получается совершать ошибки. Хочешь не совершать? Пиши на Ada.

Автор: Jeka178RUS 3.9.2013, 12:37
Замечательный пример "как не надо делать" я нашел в недрах Ericsson Labs: в одном файле https://labs.ericsson.com/blog/updated-ericsson-texture-compression-tool  16 000 строк кода на С. Насколько нужно быть упоротым человеком чтобы так кодить?

Автор: ТарасАтавин 5.9.2013, 11:24
Цитата(bsa @  3.9.2013,  10:30 Найти цитируемый пост)
У меня такой вопрос, а нахрена вызывать конструктор два раза?
Затем, что забыл, что один раз уже вызвал.

Добавлено @ 11:26
Цитата(bsa @  3.9.2013,  10:30 Найти цитируемый пост)
 Хинт: как поведет себя оператор присваивания с неинициализированным объектом?
Думаешь я не реаллокил массивы объектов? Нормально он себя поведёт, непроиниченный объект просто содержит мусор. Ну и что, если его всё равно надо затереть нормальными данными?

Автор: bsa 5.9.2013, 12:30
Цитата(ТарасАтавин @  5.9.2013,  12:24 Найти цитируемый пост)
Думаешь я не реаллокил массивы объектов? Нормально он себя поведёт, непроиниченный объект просто содержит мусор. Ну и что, если его всё равно надо затереть нормальными данными?
Садись. Кол тебе! Бегом читать книжки по С++ для начинающих.

Цитата(ТарасАтавин @  5.9.2013,  12:24 Найти цитируемый пост)
Затем, что забыл, что один раз уже вызвал.
Кстати, а ты вообще знаешь, как вызвать конструктор класса? А деструктор? И часто ты их вызываешь вручную?
Кстати, следуя этой логике не нужны и new/delete, так как можно два раза выделить память.

Автор: ТарасАтавин 5.9.2013, 14:09
Цитата(bsa @  5.9.2013,  12:30 Найти цитируемый пост)
Садись. Кол тебе! Бегом читать книжки по С++ для начинающих.
Сам читай. У меня 13 лет практического опыта.

Добавлено @ 14:11
Цитата(bsa @  5.9.2013,  12:30 Найти цитируемый пост)
Кстати, а ты вообще знаешь, как вызвать конструктор класса? А деструктор? И часто ты их вызываешь вручную?
Ни когда. 
Цитата(bsa @  5.9.2013,  12:30 Найти цитируемый пост)
Кстати, следуя этой логике не нужны и new/delete, так как можно два раза выделить память. 
А как тогда вообще хоть что то писать? Резервировать массивы, как во времена лорда Клайва Синклера? К тому же new/delete мудрено забыть, так как они  естественно вытекают из динамического создания/удаления. А конструкторы/деструкторы придуманы именно для того, чтоб вызываться неявно. Иначе юзай вместо них методы Create/Free, больше ни в чём конструкторам/деструкторам не уступающие.

Автор: bsa 5.9.2013, 15:26
Цитата(ТарасАтавин @  5.9.2013,  15:09 Найти цитируемый пост)
У меня 13 лет практического опыта.
Опыт опыту рознь. Некоторые новички и то больше знают и умеют.
Цитата(ТарасАтавин @  5.9.2013,  15:09 Найти цитируемый пост)
Ни когда. 
Ответ на вопрос о способах вызова конструктора и деструктора я так и не получил. Значит не знаешь. Тогда о чем вообще речь? Как ты можешь критиковать что-то, что ты вообще никогда не видел и уж тем более не задумывался о назначении.

Цитата(ТарасАтавин @  5.9.2013,  15:09 Найти цитируемый пост)
А как тогда вообще хоть что то писать?
Это к тебе вопрос, а не ко мне. Так как это ты выразил мысль, что явный вызов конструкторов и деструкторов не нужен, так как может привести к повторной инициализации.

Так как кто-то книжки читать не любит (видимо на основании 13-ти летного опыта), то справочно сообщаю, что явно вызвать конструктор класса можно только используя так называемый http://ru.wikipedia.org/wiki/New_(C%2B%2B)#Placement_new (указанный пример кода показывает на сколько это нетривиальная операция, по которой даже нельзя сказать, что это вызов конструктора). А операция MyClass() не является вызовом конструктора в чистом виде - это фактически создание временного объекта связанное с вызовом указанного конструктора.

Автор: ТарасАтавин 5.9.2013, 16:05
Цитата(bsa @  5.9.2013,  15:26 Найти цитируемый пост)
Это к тебе вопрос, а не ко мне. Так как это ты выразил мысль, что явный вызов конструкторов и деструкторов не нужен, так как может привести к повторной инициализации.
Я имел ввиду только конструкторы/деструкторы, которым в такой ситуации здорово психологически мешает неявный вызов, о котором думать не надо. А new/delete применяются только явно и предназначены для указания момента создания/удаления. Если ты хочешь создать нечто в определённый момент, так неужели ж забудешь, когда именно и сколько раз? И совсем другое дело создание вообще той же сущности.

Добавлено через 3 минуты и 58 секунд
Цитата(bsa @  5.9.2013,  15:26 Найти цитируемый пост)
Так как кто-то книжки читать не любит (видимо на основании 13-ти летного опыта), то справочно сообщаю, что явно вызвать конструктор класса можно только используя так называемый "размещающий new" (указанный пример кода показывает на сколько это нетривиальная операция, по которой даже нельзя сказать, что это вызов конструктора). А операция MyClass() не является вызовом конструктора в чистом виде - это фактически создание временного объекта связанное с вызовом указанного конструктора. 
"Это не вызов конструктора, а создание объекта и для этого вызов конструктора"? Ты серьёзно? Одно от другого ваще то не отделимо: объекты создаются только конструкторами, а конструкторы всегда создают объекты. Читай книги.

Автор: akizelokro 5.9.2013, 16:11
Тарас, цепляй ObjectiveC. На Западе многие его юзают, кстати. По крайней мере в заказах постоянно вижу.

Автор: ТарасАтавин 5.9.2013, 16:11
Цитата(bsa @  5.9.2013,  15:26 Найти цитируемый пост)
Опыт опыту рознь. Некоторые новички и то больше знают и умеют.
О присваивании непроиниченному объекту? Ну ну. Я это практически делал. И наблюдал под дебагером, что именно у меня получалось.

Добавлено через 1 минуту и 28 секунд
Цитата(akizelokro @  5.9.2013,  16:11 Найти цитируемый пост)
Тарас, цепляй ObjectiveC.
Си с классами вместо полноценного объектного языка? Сам цепляй эту полумеру.

Автор: bsa 5.9.2013, 17:37
Цитата(ТарасАтавин @  5.9.2013,  17:11 Найти цитируемый пост)
Си с классами вместо полноценного объектного языка? Сам цепляй эту полумеру
Ну почему же ты постоянно пытаешься спорить по вопросам, в которых ничего не понимаешь?
Цитата(ТарасАтавин @  5.9.2013,  17:05 Найти цитируемый пост)
"Это не вызов конструктора, а создание объекта и для этого вызов конструктора"? Ты серьёзно? Одно от другого ваще то не отделимо: объекты создаются только конструкторами, а конструкторы всегда создают объекты
Да. Отличимо. Конструктор - это по сути функция, которая используется для инициализации объекта. А создание временной переменной - это выделение памяти в стеке, вызов конструктора и планирование вызова деструктора (кстати, все это делается неявно). То что синтаксис похож на вызов конструктора не говорит ни о чем - просто для удобства. Два раза проинициализировать один и тот же объект таким образом невозможно.

Добавлено через 1 минуту и 5 секунд
Цитата(ТарасАтавин @  5.9.2013,  17:05 Найти цитируемый пост)
Я имел ввиду только конструкторы/деструкторы, которым в такой ситуации здорово психологически мешает неявный вызов, о котором думать не надо.
Че?

Добавлено через 8 минут и 34 секунды
Кстати, есть очень красивая реализация оператора присваивания с использованием создания временной переменной:
Код
MyClass& MyClass::operator=(const MyClass &other)
{
   MyClass(other).swap(*this);
/*
   Можно написать так:
   MyClass tmp(other);
   tmp.swap(*this);
   но вариант выше короче (генерируемый код одинаков)
*/
}

Автор: ТарасАтавин 7.9.2013, 08:03
Цитата(bsa @  5.9.2013,  17:37 Найти цитируемый пост)
Да. Отличимо. Конструктор - это по сути функция, которая используется для инициализации объекта. А создание временной переменной - это выделение памяти в стеке, 
Временной переменной, или временного объекта? Создание автоматического/динамического объекта состоит из выделения памяти и вызова конструктора по адресу этой памяти. Пока конструктор не отработал, объект не создан, будь он хоть трижды временным.

Добавлено @ 08:08
Цитата(bsa @  5.9.2013,  17:37 Найти цитируемый пост)
Да. Отличимо. Конструктор - это по сути функция, которая используется для инициализации объекта. 
 Вот именно. Обычная функция, отличающаяся ровно двумя признаками:
1. Может вызываться не явно при входе в область видимости, в которой декларирован автоматический объект, при загрузке модуля, в котором декларирован статический объект и из оператора new.
2. Предназначена для начальной инициализации объекта,
За назначением остальных функций следит автор, в том числе их можно предназначить для той же цели, что и конструктор. И что же остаётся от конструктора, если его пытаются вызвать явно? Placement new же вызывает конструкторы не явно. Кстати, пустые конструкторы инициализацией не занимаются, их назначение - соблюдение формального правила о создании объектов только через конструктор. Но почему-то 
Код
class TVector {double x,y,z;};
TVector a;
TVector b;
b.x=2.0;
b.y=3.0;
b.z=4.68;
a=b;
 отлично компилится и исполняется, хотя конструктор класса TVector здесь пуст и объект a не инитится. Присваивание по указателю после malloc/realloc ни чем не отличается. Проверено.

Автор: bsa 9.9.2013, 11:26
Цитата(ТарасАтавин @  7.9.2013,  09:03 Найти цитируемый пост)
Временной переменной, или временного объекта?
Может написать отличия?
Цитата(ТарасАтавин @  7.9.2013,  09:03 Найти цитируемый пост)
Создание автоматического/динамического объекта состоит из выделения памяти и вызова конструктора по адресу этой памяти. Пока конструктор не отработал, объект не создан, будь он хоть трижды временным.
Я написал что-то противоречащее этому утверждению?
Цитата(ТарасАтавин @  7.9.2013,  09:03 Найти цитируемый пост)
Может вызываться не явно при входе в область видимости
Она вызывается не при входе в область видимости, а при инициализации переменной (объекта). Т.е. если переменная объявлена в конце блока, то конструктор она не вызовется сразу при входе.
Цитата(ТарасАтавин @  7.9.2013,  09:03 Найти цитируемый пост)
И что же остаётся от конструктора, если его пытаются вызвать явно?
Как ты вызываешь конструктор явно? Покажи пример кода!
Цитата(ТарасАтавин @  7.9.2013,  09:03 Найти цитируемый пост)
Placement new же вызывает конструкторы не явно.
Ты можешь сколько угодно тут разводить демагогию про явно и неявно, но placement new делает только одну операцию: вызов конструктора класса для инициализации объекта в указанной области памяти. И все! Поэтому я никогда бы не сказал, что он делает это неявно.
Цитата(ТарасАтавин @  7.9.2013,  09:03 Найти цитируемый пост)
Кстати, пустые конструкторы инициализацией не занимаются, их назначение - соблюдение формального правила о создании объектов только через конструктор.
И? Я где-то этому противоречил?
Цитата(ТарасАтавин @  7.9.2013,  09:03 Найти цитируемый пост)
отлично компилится и исполняется, хотя конструктор класса TVector здесь пуст и объект a не инитится.
И? Я где-то опровергал это?
Цитата(ТарасАтавин @  7.9.2013,  09:03 Найти цитируемый пост)
Присваивание по указателю после malloc/realloc ни чем не отличается. Проверено.
Проверь теперь этот код:
Код
std::string *p = (std::string*)malloc(sizeof(*p) * 5);
*p = "1234";
p = realloc(p, sizeof(*p) * 20);
*p = "3456";
И объясни (главное себе), почему он не работает. 

Автор: ТарасАтавин 18.9.2013, 14:36
Цитата(bsa @  5.9.2013,  17:37 Найти цитируемый пост)
MyClass& MyClass::operator=(const MyClass &other)
{
   MyClass(other).swap(*this);
/*
   Можно написать так:
   MyClass tmp(other);
   tmp.swap(*this);
   но вариант выше короче (генерируемый код одинаков)
*/
}
Своп предполагает, что присваивание происходит сразу и слева на право, и наоборот, const запрещает всякое изменение правого операнда. Даже если эта пакость скомпилится, первая мысль при чтении такого безобразия будет или прямо противоположной, или, что опретор присваивания меняет оба операнда. А на, чтоб разобраться, уйдёт время. Убирать const - ещё хуже: оператор именно поменяет местами свои операнды, чего делать не должен.

Автор: Guinness 18.9.2013, 14:42
ТарасАтавин, вообще-то, это классика как нужно писать оператор присваивания, чтобы делать его "безопасным для исключений"(тут с термином мог ошибиться, не помню как у Саттера там классификация идет). Более того, таким образом мы гарантируем, что и копирующий конструктор и оператор присваивания у нас делают одно и тоже.
А если конструкция не привычна для восприятия, то нужно привыкать.

Автор: ТарасАтавин 18.9.2013, 18:56
Цитата(Guinness @  18.9.2013,  14:42 Найти цитируемый пост)
ТарасАтавин, вообще-то, это классика как нужно писать оператор присваивания, чтобы делать его "безопасным для исключений"
А как можно умудриться сделать опасный оператор присваивания? Кроме MyClass& MyClass::operator=(MyClass &other)
{
   MyClass(other).swap(*this);
}[/code], конечно. Кстати, оператор присваивания обязан возвращать ссылку на this, так что ваша "классика" страдает грубым нарушением стандарта.

Автор: mes 18.9.2013, 19:49
Цитата(ТарасАтавин @  18.9.2013,  13:36 Найти цитируемый пост)
const запрещает всякое изменение правого операнда
правый операнд это other ? больше ничего с конст не нахожу.. 
и где ктор его меняет  smile  smile 

Цитата(ТарасАтавин @  5.9.2013,  13:09 Найти цитируемый пост)
У меня 13 лет практического опыта

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

Добавлено через 2 минуты и 9 секунд
Цитата(ТарасАтавин @  18.9.2013,  17:56 Найти цитируемый пост)
 Кстати, оператор присваивания обязан возвращать ссылку на this, 

а как насчет того, чтоб читать между строк  ? 
эта строчка с возвращением this никакой роли не влияет, потом в форумных примерах на коленке может быть безболезнено упущена  smile

Добавлено через 6 минут и 49 секунд
 smile 
ТарасАтавин, был тут на форуме уже докторКтоТоТам, тоже себя в грудь бил и кричал громче всех.. 
еще и книжки писал.. Вы еще не пробовали ? что ж ценный опыт пропадает ... 


Автор: baldina 19.9.2013, 10:42
Цитата(mes @  18.9.2013,  19:49 Найти цитируемый пост)
был тут на форуме уже докторКтоТоТам

немало ИТшных форумов, где он был заблокирован...  smile 

Автор: bsa 20.9.2013, 12:34
ТарасАтавин, расскажи, что делает конструкция MyClass(*this)?

Автор: azesmcar 24.9.2013, 13:46
Цитата(Guinness @  18.9.2013,  14:42 Найти цитируемый пост)
вообще-то, это классика как нужно писать оператор присваивания, чтобы делать его "безопасным для исключений"

вообще-то любая функция, которая при возникновении исключений гарантирует отсутствие утечки ресурсов уже сама по себе является exception safe, так-как соответствует базовому правилу безопасности исключений Абрахамса (раз уж вспомнили Сатера, то Сатер в своей книге цитировал именно его). А сохранение состояния программы при возникновении исключений является строгой гарантией, которую можно обеспечивать а можно и нет, зависит от программы.

Автор: azesmcar 24.9.2013, 16:04
Цитата(ТарасАтавин @  5.9.2013,  11:24 Найти цитируемый пост)
Нормально он себя поведёт, непроиниченный объект просто содержит мусор. 

Да, а что если это не тривиальный объект с двумя целочисленными типами а скажем что нибудь посложнее..ну например вот такой класс
Код

class X
{
public:
   X()
   {
      iptr = 0;
   }

   X(int v)
   {
      iptr = new int(v);
   }

   ~X()
   {
      delete iptr;
   }

   X& operator = (const X& p)
   {
      delete iptr;

      if (p.iptr != 0)
      {
         iptr = new int(*p.iptr);
      } else
      {
         iptr = 0;
      }

      return *this;
   }
private:
   int* iptr;
};

Что буде на 21-ой строке, если он содержит мусор?

Автор: ТарасАтавин 7.10.2013, 18:26
Цитата(mes @  18.9.2013,  19:49 Найти цитируемый пост)
и где ктор его меняет
swap.

Добавлено @ 18:28
Цитата(mes @  18.9.2013,  19:49 Найти цитируемый пост)
а как насчет того, чтоб читать между строк  ? 
Даже если return *this спрятано внутри swap, реализация оператора присваивания не содержит этой операции, а по стандарту должна.

Добавлено @ 18:31
Цитата(mes @  18.9.2013,  19:49 Найти цитируемый пост)
ТарасАтавин, был тут на форуме уже докторКтоТоТам, тоже себя в грудь бил и кричал громче всех.. 
еще и книжки писал.. Вы еще не пробовали ? что ж ценный опыт пропадает ... 
И это говорит человек, игнорирующий return *this. Ну ка как должен повести себя 
Код
class MyClass
 public:
  void operator = (MyClass &x);
...
 при 
Код
MyClass a, b, c;
...
a=b=c;
? По идее компилятор должен ругнуться, в то время как для всех встроенных типов это вполне валидная строка и 
Код
class MyClass
 public:
  MyClass &operator = (MyClass &x);
...
 сохраняет её валидность. То есть пропущенный return *this или вызовет лишний warning, что чревато пропуском уже серьёзной ошибки, или меняет интерфейс стандартного оператора, что как раз есть классика наглядных пособий как делать не надо.

Добавлено через 10 минут и 20 секунд
Цитата(bsa @  20.9.2013,  12:34 Найти цитируемый пост)
 расскажи, что делает конструкция MyClass(*this)? 
Копирует, да вот беда: анализ подобных мелочей занимает лишнее время, а по закону Мёрфи, гласящему что всё, что может быть понято не правильно, именно так и будет понято, кто нибудь обязательно его вообще не заметит.

Автор: ТарасАтавин 7.10.2013, 18:46
Цитата(azesmcar @  24.9.2013,  16:04 Найти цитируемый пост)
Да, а что если это не тривиальный объект с двумя целочисленными типами а скажем что нибудь посложнее..ну например вот такой класс
А как на счёт объекта, декларация членов-данных которого занимают более пяти экранов? malloc от этого не зависит, а первое же присваивание мусор затрёт. А объект, знающий, что он - узел дерева с динамическим массивом потомков и при этом ещё одновременно содержащий несколько динамических массивов объектов других классов, чьи экземпляры не знают, где они валяются? в указатель отдельным присваиванием пишется NULL, потом присваивание всего объекта, затирающее остальной мусор. Только это не удобно. А удобно и уместно вызывать конструктор оператором new.

Автор: bsa 9.10.2013, 10:59
ТарасАтавин, ты что к мелочам цепляешься? Тебе концепцию показывают. Естественно, что в нормальном коде должен быть и return *this. Он в данном случае не он главное. Главное, каким образом реализуется основная функциональность.

Цитата(ТарасАтавин @  7.10.2013,  19:26 Найти цитируемый пост)
Копирует, да вот беда: анализ подобных мелочей занимает лишнее время, а по закону Мёрфи, гласящему что всё, что может быть понято не правильно, именно так и будет понято, кто нибудь обязательно его вообще не заметит.
Что и куда копирует?

Добавлено через 9 минут и 45 секунд
Цитата(ТарасАтавин @  7.10.2013,  19:46 Найти цитируемый пост)
А как на счёт объекта, декларация членов-данных которого занимают более пяти экранов?
Программиста надо уволить с записью в трудовой о непригодности к профессии.

Цитата(ТарасАтавин @  7.10.2013,  19:46 Найти цитируемый пост)
malloc от этого не зависит, а первое же присваивание мусор затрёт.
А кто проинициализировал присваиваемый объект? Что будет, если будет вызван деструктор изначального объекта?

Цитата(ТарасАтавин @  7.10.2013,  19:46 Найти цитируемый пост)
А объект, знающий, что он - узел дерева с динамическим массивом потомков и при этом ещё одновременно содержащий несколько динамических массивов объектов других классов, чьи экземпляры не знают, где они валяются?
Объекты не думают. Они являются. И есть стандартное правило - освобождением ресурсов занимается тот, кто их выделяет. Исключение (условное) - умные указатели.

Цитата(ТарасАтавин @  7.10.2013,  19:46 Найти цитируемый пост)
в указатель отдельным присваиванием пишется NULL, потом присваивание всего объекта, затирающее остальной мусор. Только это не удобно. А удобно и уместно вызывать конструктор оператором new.
Вот и объясни, зачем мучаться с malloc/new()/деструктор/free, когда можно использовать new/delete? Более того, можно использовать умные указатели, и в этом случае тебе достаточно будет сделать только new, а все остальное ляжет на плечи указателя.

Автор: ТарасАтавин 9.10.2013, 12:34
Цитата(bsa @  9.10.2013,  10:59 Найти цитируемый пост)
ты что к мелочам цепляешься? Тебе концепцию показывают. Естественно, что в нормальном коде должен быть и return *this. Он в данном случае не он главное. Главное, каким образом реализуется основная функциональность.
Именно с таким подходом его и не оказывается в коде релиза. И не только его, но и 
Код
int rnd ()
{
 return 14; /*Проверено: 14 - стопроцентно случайное число*/
}
, наоборот, оказывается в коде.

Добавлено через 2 минуты и 36 секунд
Цитата(bsa @  9.10.2013,  10:59 Найти цитируемый пост)
Что и куда копирует?
Какая разница? Речь о том, что код читается, как 
Код
swap(*this, Parametr);
, то есть обмен параметра местами с мусором, а не о том, что именно это он и означает.

Автор: baldina 9.10.2013, 12:38
Цитата(bsa @  9.10.2013,  10:59 Найти цитируемый пост)
cтандартное правило - освобождением ресурсов занимается тот, кто их выделяет

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

Добавлено через 1 минуту
Цитата(ТарасАтавин @  9.10.2013,  12:34 Найти цитируемый пост)
Именно с таким подходом его и не оказывается в коде релиза.

это уже мозгоклюйство. ведь все всё поняли. 

Автор: bsa 10.10.2013, 12:02
Цитата(ТарасАтавин @  9.10.2013,  13:34 Найти цитируемый пост)
то есть обмен параметра местами с мусором, а не о том, что именно это он и означает.
 smile 
Где ты мусор тут нашел? Оператор присваивания ВСЕГДА оперирует с инициализированными объектами. Если какой-то негодяй не инициализирует объекты в конструкторе, то это его проблемы. Дальнейшие рассуждения по поводу качества кода с ним можно не продолжать.

Автор: Lukkoye 4.1.2014, 01:27
Цитата(bsa @  19.3.2012,  13:18 Найти цитируемый пост)
Самый быстрый доступ к элементам в векторе. Самое быстрое удаление/вставка в середину в списке.


Существует миф, который заслуживает того, что бы его разоблачили.

Действительно: вставка у листа быстрая. Однако, реализация со стандартным аллокатором задействует оператор new. 
Который черезвычайно медленный. 

Настолько медленный, что за это время можно несколько раз вставить элемент размеров в 32 байта и в количествt 1000 штук (я делал замеры по скорости, но это было давно и точных цифр не помню) в вектор путем копирования его элементов в право (расширение), при условии, что у вектора достаточно резерва и он не реалокнется.

Таким образом, если вы используете стандартный аллокатор листа, который идет в с ним по дефолту, то по скорости работы на прикладных задачах он редко когда выигрывает у вектора. И никогда не выигрывает, если количество элементов - не велико.

Использовать его ради достижения перфоманса имеет смысл, если вы используете свои аллокаторы с уже заранее зарезервированной памятью. И не имеете потерь на её выделение оператором new


Автор: baldina 4.1.2014, 22:08
Ну мифа-то нет никакого, речь идет об асимптотическом поведении, а константы могут быть сколь угодно большими.

что касается замеров скорости, я не вижу подтверждения:
http://ideone.com/bAzcuQ

Автор: azesmcar 13.1.2014, 16:47
baldina

Хитришь smile 
Сравнение не честное, причем ни для вектора ни для листа.
Не учитывается время на аллокацию памяти для вектора, так-как делается резерв и не учитывается тот факт, что вставка в определенную позицию вектора (в данном случае в начало) медленная операция.
Было бы честно сравнить время вместе с вызовом резерва и с операцией push_back.

Вот результаты без вызора vector::reserve вообще и с push_back вместо insert для 100000000 элементов.

Код

vector time = 570000
list time   = 2890000


Ключевую роль играет кэширование при копировании данных в векторе.

Автор: baldina 13.1.2014, 18:42
Цитата(azesmcar @  13.1.2014,  16:47 Найти цитируемый пост)
Не учитывается время на аллокацию памяти для вектора

это входило в условия, см. выше

Цитата(azesmcar @  13.1.2014,  16:47 Найти цитируемый пост)
не учитывается тот факт, что вставка в определенную позицию вектора (в данном случае в начало) медленная операция

вставка в любую позицию вектора это медленная операция. при случайной позиции среднее число перемещений n/2
так что скорее вставка в конец не честна. 
и про это не было в условиях. если бы я выбрал середину, результат у вектора был бы лучше, но лишь в 2 раза. т.е. не принципиально

так что считаю свой тест адекватным ;-)

:off
для тех кто не все понял с первого раза.
тесты (наукообразно - эмпирический анализ) штука тонкая. что бы их проводить (и что бы интерпретировать готовые результаты) нужно учитывать самые различные факторы (все существенные).
что бы потом не стыдиться своих скороспелых заявлений об ошибках в компиляторах, развенчании мифов и т.п.

Автор: azesmcar 13.1.2014, 18:51
Цитата(baldina @  13.1.2014,  18:42 Найти цитируемый пост)
это входило в условия, см. выше

Ну тогда тем более вектор быстрее smile

Цитата(baldina @  13.1.2014,  18:42 Найти цитируемый пост)
вставка в любую позицию вектора это медленная операция. при случайной позиции среднее число перемещений n/2

Ну так и я об этом smile 

Цитата(baldina @  13.1.2014,  18:42 Найти цитируемый пост)

так что скорее вставка в конец не честна. 
и про это не было в условиях. если бы я выбрал середину, результат у вектора был бы лучше, но лишь в 2 раза. т.е. не принципиально

В таком случае число перемещений эквивалентно числу числу вставляемых элементов. Если это то, что просил автор, тогда не совсем понятно с какой пьяни сравнивать контейнеры в контексте задачи, для которой один из них совершенно непригоден (это я про вектор) smile
А вариант со вставкой в конец честен чем, что использует оба контейнера эффективно, а не использует заранее неэффективный метод одного и сравнивает с другим smile

Добавлено через 8 минут и 44 секунды
baldina

Цитата(Lukkoye @  4.1.2014,  01:27 Найти цитируемый пост)
Настолько медленный, что за это время можно несколько раз вставить элемент размеров в 32 байта и в количествt 1000 штук (я делал замеры по скорости, но это было давно и точных цифр не помню) в вектор путем копирования его элементов в право (расширение), при условии, что у вектора достаточно резерва и он не реалокнется.

Ага, вижу. Невнимательно прочитал сперва.

Ну тогда да, естественно лист будет быстрее.

Автор: nonaot 14.1.2014, 22:50
Модератор: Сообщение скрыто.

Автор: Artemon 21.2.2014, 21:59
Интересно, у кого-то бывает такое: находишь какой-то очень тонкий момент в коде, ставишь у себя в голове пометку, что так больше делать не нужно. Потом со временем забываешь и восстанавливая из памяти куски информации кажется, что именно так и нужно сделать.

Автор: NoviceF 5.5.2014, 17:06
Цитата(Artemon @  21.2.2014,  22:59 Найти цитируемый пост)
Потом со временем забываешь и восстанавливая из памяти куски информации кажется, что именно так и нужно сделать


Похоже это какое-то свойство памяти.. у меня такое бывает безотносительно кода smile

Автор: TarasProger 15.8.2015, 12:25
Цитата(Ignat @  18.3.2006,  06:52 Найти цитируемый пост)
1. Видимо, все знание автора об отличиях С от С++ сводится к наличию единственного класса, единственный экземпляр которого инстанцирован в структуру(!), что само по себе нормально, за исключением того вопроса на фига это там было нужно, для меня так и
осталось загадкой.
Наоборот я ещё себе хоть как то представлюя. Но экземпляр класса в роли члена стурктуры?! Энто ж за задача нужна, чтоб оправдать такое безобразие?

Добавлено через 7 минут и 27 секунд
Цитата(Ignat @  18.3.2006,  06:52 Найти цитируемый пост)
Но, блин, чтоб выбрать элемент по имени,
мне перебор прикажете делать?

1. А что сложного его сделать?
2. Для этой целим можно сделать функцию find. А если бы программа была по-настоящему ООП-ной, то и перегрузить оператор [], чтоб индексировал по стригам. Релизация - тот же перебор.
3. Зачем сдесть STL?

Добавлено через 9 минут и 43 секунды
Цитата(Ignat @  18.3.2006,  06:52 Найти цитируемый пост)
void stdexitcls(char s, float pt, float sl, int bth)
{ sexord=1; sexi=s; sexpt=ptt(pt); sexsl=ptt(sl); sexbrs=bth; };
Вот я тоже не телепат. Смотрим объявление, например: 
Очистка экрана при выходе из пространства имён std. Вот только как это будет на c/c++?

Добавлено через 10 минут и 51 секунду
Цитата(Ignat @  18.3.2006,  06:52 Найти цитируемый пост)
Вот я тоже не телепат. Смотрим объявление, например:
char sexi; // standard exit id
Есть пол МЭ, есть пол ЖО, оба сложены в массив, а эта переменная - её индекс.

Добавлено через 14 минут и 1 секунду
Цитата(chipset @  18.3.2006,  07:09 Найти цитируемый пост)
10. switch на 10 вариантов.
А, ну конечно, он предназначен для одного варианта. Вот только чем тогда if не устроил, что свич понадобился?

Автор: TarasProger 15.8.2015, 12:42
Цитата(chipset @  18.3.2006,  07:09 Найти цитируемый пост)
11. Функции принимающие 10 (да-да, 10) параметров.
А 35 не хотите? А то и 50. При этом все одного типа.

Автор: TarasProger 15.8.2015, 13:05
Рекурсия на пустом месте: 
Код
unsgned long long int Fact(uint8_t n)
{
 if (n==0)
 {
  return 1;
 }
 return n*Fact(n-1);
}
 и особенно: 
Код
double Det(double a[300][300], size_t n)
{
 double m[300][300];
 size_t i;
 size_t i1;
 size_t i2;
 size_t j;
 double r;
 double b;
 if (n==2)
 {
  return a[0][0]*a[1][1]-a[0][1]*a[1][0];
 }
 for (r=0.0, i=0; i<n; ++i)
 {
   for (i1=0, i2=0, i1<n; ++i1)
   {
    if (i1!=i)
    {
     for (j=1; j<n; ++j)
     {
      m[j][i2]=a[j-1][i1];
     }
    }
    ++i2;
   }
   b=det(m, n-1);
   if ((i%2)==0)
   {
    r+=b;
   }
   else
   {
    r-=b;
   }
 }
 return r;
}
.

Автор: korol 4.3.2016, 13:10
Модератор: Сообщение скрыто.

Автор: richardy 24.6.2020, 11:06
Thanks!!

Автор: Эле7 1.7.2020, 14:57
Здравствуйте. Может кто - нибудь помочь мне с написанным кодом С++ по простой задачке на расчет дисперии и среднего значения. Всю голову сломала что не так с кодом и компилятором....

Добавлено через 30 секунд
Код программы  и задание могу выслать

Автор: Zonanor 4.1.2021, 01:09
А там ни малейшего ###она нету же, как я знаю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)