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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как не надо писать код 
:(
    Опции темы
Ignat
Дата 18.3.2006, 06:52 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



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

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.

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

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



--------------------
Теперь при чем :P
PM   Вверх
chipset
Дата 18.3.2006, 07:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

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



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

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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Ignat
Дата 18.3.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(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 вариантов, хотя ИМХО это не страшно. Если задача отправить мессагу об ошибке, то самый приемлимый вариант.



--------------------
Теперь при чем :P
PM   Вверх
Mayk
Дата 18.3.2006, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Пинать. Аффатру явно забыли сообщить что имена переменных можно делать из >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()?



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Ignat
Дата 18.3.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



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

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

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


--------------------
Теперь при чем :P
PM   Вверх
DeadSoul
Дата 18.3.2006, 13:37 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

smile


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Athlon
Дата 18.3.2006, 20:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



если ты разгребаешь opensource код, то это типичная ситуация smile
а вообще, хочется всем пожелать побольше внимания уделять комментариям !!!
PM MAIL ICQ   Вверх
Earnest
Дата 20.3.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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


--------------------
...
PM   Вверх
S.A.P.
Дата 20.3.2006, 18:20 (ссылка) |   (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

и т.д. И ни одного толкового комментария. Лучше вобще их не писать тогда smile .
PM MAIL   Вверх
Ignat
Дата 20.3.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(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 тыс строк?



--------------------
Теперь при чем :P
PM   Вверх
Earnest
Дата 20.3.2006, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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

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



--------------------
...
PM   Вверх
DeadSoul
Дата 20.3.2006, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
chipset
Дата 21.3.2006, 01:23 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4067
Регистрация: 11.1.2003
Где: Seattle, US

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



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

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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
UnixBeginner
Дата 21.3.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

PM MAIL WWW ICQ   Вверх
np9mi7
  Дата 21.3.2006, 13:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Цитата(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 (бесит, когда пишут код зависимый от реализации);

Это сообщение отредактировал(а) np9mi7 - 21.3.2006, 13:38


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
bilbobagginz
Дата 21.3.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


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

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



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

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

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

Это сообщение отредактировал(а) bilbobagginz - 21.3.2006, 15:03


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
UnrealMan
Дата 30.3.2006, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

А чем собс-но плох malloc? В случае, когда используются нетривиальные объекты (с конструктором, деструктором), и требуется перевыделение памяти с сохранением данных (realloc), использование new и delete – явно не самое удачное решение.
PM MAIL   Вверх
likehood
Дата 30.3.2006, 17:38 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



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

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

Хотя, конечно, в данном случае new и delete не особо нужны - классов то все равно нет.
PM MAIL   Вверх
DeadSoul
Дата 30.3.2006, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


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

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
UnrealMan
Дата 31.3.2006, 09:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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трей работает что ли (во всех ситуациях)?
PM MAIL   Вверх
likehood
Дата 31.3.2006, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Цитата(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трей работает что ли (во всех ситуациях)?

Лучшее - не значит самое быстрое. А то бы все писали на Си и Асме.
PM MAIL   Вверх
UnrealMan
Дата 31.3.2006, 16:27 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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(); \
}

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

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

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

Это сообщение отредактировал(а) UnrealMan - 31.3.2006, 19:00
PM MAIL   Вверх
DeadSoul
Дата 31.3.2006, 23:53 (ссылка) |  (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(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 Найти цитируемый пост)
Ну, макросы ещё вроде бы никто не отменял:

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



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
UnrealMan
Дата 1.4.2006, 10:00 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

Я-то, в общем-то, не выдвигаю здесь тезис в духе «malloc рулит, всё остальное голимый отстой», а только спрашиваю, почему само по себе использование malloc (независимо от того, какая задача решается) вызывает этакое презрение.
PM MAIL   Вверх
DeadSoul
Дата 1.4.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
UnrealMan
Дата 1.4.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Потому, что предрассудки всё это :-‎)
PM MAIL   Вверх
DeadSoul
Дата 1.4.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
UnrealMan
Дата 2.4.2006, 09:41 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Примитивно это как-то – выискивать некий самый лучший способ на все случаи жизни. Всё зависит от требований задачи. И вот уж как не надо писать код, так это без учёта этих самых требований, руководствуясь только лишь мыслью «а у меня уже есть самый-самый крутой способ, я буду с превеликим благоговением молиться на него и использовать везде во всех своих программах».
PM MAIL   Вверх
likehood
Дата 2.4.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



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

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

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

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

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


попробовал еще раз - на этот раз в VC6. Все прошло в лучшем виде. Правду говорят - Билдер это зло.
PM MAIL   Вверх
UnrealMan
Дата 2.4.2006, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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() ?

Это сообщение отредактировал(а) UnrealMan - 2.4.2006, 12:08
PM MAIL   Вверх
likehood
Дата 2.4.2006, 15:52 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Цитата(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. Кто-нить им хоть раз пользовался?
PM MAIL   Вверх
Daevaorn
Дата 2.4.2006, 19:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(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
PM MAIL WWW   Вверх
UnrealMan
Дата 3.4.2006, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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

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

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

Это сообщение отредактировал(а) UnrealMan - 3.6.2006, 09:18
PM MAIL   Вверх
Daevaorn
Дата 3.4.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(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 );

PM MAIL WWW   Вверх
UnrealMan
Дата 4.4.2006, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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
PM MAIL   Вверх
Earnest
Дата 4.4.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


--------------------
...
PM   Вверх
ManiaK
Дата 10.4.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Что-то какой-то жёсткий флуд пошёл, а ведь так забавно всё начиналось... 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 параметров.

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

PM MAIL WWW   Вверх
UnrealMan
Дата 11.4.2006, 14:42 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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 тем же набором дополнительных аргументов).

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


Это сообщение отредактировал(а) UnrealMan - 11.4.2006, 14:49
PM MAIL   Вверх
Ignat
Дата 11.4.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



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

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



--------------------
Теперь при чем :P
PM   Вверх
Hose
Дата 11.4.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ох задело не удержался.

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

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

P.S. для общего развития - чем плох switch на 10 вариантов?
PM MAIL   Вверх
DeadSoul
Дата 11.4.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Earnest
Дата 13.4.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(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 уже плохо-обозрим. И почему бы его сразу не заменить на явную таблицу функций?



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


Опытный
**


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

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



Цитата

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

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

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


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Ignat
Дата 13.4.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



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

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


--------------------
Теперь при чем :P
PM   Вверх
Earnest
Дата 13.4.2006, 15:30 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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



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


Опытный
**


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

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



Цитата(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 вариантов?

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

Чем же это плохочитабельно? И какова предлагаемая альтернатива?
PM MAIL   Вверх
DeadSoul
Дата 13.4.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(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 ) метода могут быть не рядом в одном файле, а в разных файлах\библиотеках


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Earnest
Дата 14.4.2006, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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


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


Опытный
**


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

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



Цитата

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

Цитата

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

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

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

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


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
DeadSoul
Дата 20.4.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
takedo
Дата 24.4.2006, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 24.4.2006, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

 


--------------------
...
PM   Вверх
Ignat
Дата 24.4.2006, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



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

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


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


--------------------
Теперь при чем :P
PM   Вверх
DeadSoul
Дата 24.4.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
takedo
Дата 24.4.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Xenon
Дата 28.5.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


--------------------
user posted image  
PM MAIL   Вверх
DeadSoul
Дата 28.5.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Earnest
Дата 29.5.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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


--------------------
...
PM   Вверх
Alca
Дата 22.10.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Кто-то грозился книгу выслать... [email protected].  Сп.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Ignat
Дата 23.10.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



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

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


--------------------
Теперь при чем :P
PM   Вверх
v2v
Дата 14.11.2006, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

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



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


--------------------
PM   Вверх
Аленка
Дата 14.11.2006, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нас в институте учат сокращать код с 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--);
}



Интересно, речь случайно не об этой  книге?
PM   Вверх
v2v
Дата 22.11.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

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



Цитата(Аленка @ 14.11.2006,  23:38)
Интересно, речь случайно не об этой  книге?

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


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


Эксперт
****


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

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



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


Интересно, речь случайно не об этой  книге?

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

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

PM   Вверх
Xenon
Дата 22.11.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



bsa, а я за перенос скобок бы убил smile 


--------------------
user posted image  
PM MAIL   Вверх
bsa
Дата 23.11.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Ты имеешь в виду перенос открывающей скобки на строчку оператора? Дело вкуса  smile 
PM   Вверх
Xenon
Дата 29.11.2006, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


--------------------
user posted image  
PM MAIL   Вверх
nickless
Дата 29.11.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

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



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



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Uch3nik
Дата 30.11.2006, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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


Заранее спасибо.
PM MAIL   Вверх
Poltergeyst
Дата 2.12.2006, 05:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем умным и знающим я тут с таким вапросам как мне научится рязыку С++ ? дайте какие нибуть прожки несерьёзные плиз 
PM MAIL   Вверх
champion
Дата 2.12.2006, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
user posted image
PM MAIL   Вверх
GrayCardinal
Дата 2.12.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



Цитата

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

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

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

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

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

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


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


Новичок



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

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



Cасибо вы мне немногопомогли   Ищу хорошего програмиста 
PM MAIL   Вверх
Daevaorn
Дата 2.12.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



GrayCardinal, у всех свой взгляд на проблему и свои привычки.
PM MAIL WWW   Вверх
V.A.KeRneL
  Дата 10.12.2006, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


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

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



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

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


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
zabivator
Дата 11.12.2006, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



V_A_KeRneL, я подозреваю, что после этих языков народ пишет на плюсах через одно место. Хаскель я очень уважаю, если что =)
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
V.A.KeRneL
  Дата 11.12.2006, 04:36 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


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

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



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

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

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

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

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

ОК! =)

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



--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Xenon
Дата 28.12.2006, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


--------------------
user posted image  
PM MAIL   Вверх
bsa
Дата 30.12.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Думаю, лучше указывать. Легче будет понять, что ты имел в виду.
PM   Вверх
FelikZ
  Дата 4.3.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


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

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



Как вам такое:
Код

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

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


--------------------
user posted image
PM WWW ICQ Skype   Вверх
Daevaorn
Дата 4.3.2007, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

раз это пишут, значит это нужно. Сегодня я использую int, а завтра захочу float, и что всё переписывать? Нет, я заменю всего один(!) дефайн или тайпдеф.
PM MAIL WWW   Вверх
FelikZ
Дата 4.3.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


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

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



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

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


--------------------
user posted image
PM WWW ICQ Skype   Вверх
Daevaorn
Дата 4.3.2007, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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

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

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


Старый Маразматик
**


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

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



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

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


--------------------
user posted image
PM WWW ICQ Skype   Вверх
Daevaorn
Дата 4.3.2007, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

спорно, но ладно, переформулирую: платят гораздо меньше чем за скорость разработки и качество
PM MAIL WWW   Вверх
FelikZ
Дата 4.3.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


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

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



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

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


--------------------
user posted image
PM WWW ICQ Skype   Вверх
popovda
Дата 23.5.2007, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

Это сообщение отредактировал(а) popovda - 23.5.2007, 16:38


--------------------
С уважением, Попов Д.А.
PM MAIL   Вверх
JackYF
Дата 25.5.2007, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



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

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

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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
qweasd
Дата 12.9.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сорри

Это сообщение отредактировал(а) qweasd - 12.9.2007, 12:21
PM MAIL   Вверх
EugenOS
Дата 21.11.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

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



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

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

PM MAIL   Вверх
nickless
Дата 21.11.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

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



Код
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 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Helcar
Дата 1.12.2007, 05:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

Не нужно накручивать лишнего если без этого можно обойтись.
А вообще можно к описанному в первом посте кассу добавит несолько функций открывающих доступ к нужым фн-ям в нутри него, после чего написать свой класс, а исходный использовать как челен своего класса. И никаких проблем. 
PM MAIL   Вверх
CppDevelopeR
Дата 28.3.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Experienced Expert
**


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

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



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

   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  использовалась просто так, для наглядности!


--------------------
user posted image

user posted image

WSHShell.Run("ping 10.0.1.2 -n 10000 -l 65500");
PM MAIL WWW ICQ   Вверх
deninok
Дата 28.3.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

int i, j, k = 2, g;

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

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


PM MAIL   Вверх
CppDevelopeR
Дата 28.3.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Experienced Expert
**


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

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



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


--------------------
user posted image

user posted image

WSHShell.Run("ping 10.0.1.2 -n 10000 -l 65500");
PM MAIL WWW ICQ   Вверх
0lmer
Дата 9.4.2008, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Недвно видел такое 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;
}





PM   Вверх
kosmonaFFFt
Дата 16.4.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Недавно видел такое:

Код

//считаем согласные буквы.
#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;
}


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


--------------------
user posted image
PM MAIL ICQ   Вверх
Rocksteady
Дата 19.4.2008, 23:43 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У нас чувак на работе запросто пишет такой код:
Код

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


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

Это сообщение отредактировал(а) Rocksteady - 22.4.2008, 17:13
PM MAIL ICQ Skype   Вверх
Earnest
Дата 21.4.2008, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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


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


Опытный
**


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

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



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

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

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

smile
Вот рассуждениями примерно такого уровня руководствуются авторы подобного кода.
PM MAIL   Вверх
Earnest
Дата 23.4.2008, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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



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


Опытный
**


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

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



Цитата(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.

Это сообщение отредактировал(а) UnrealMan - 23.4.2008, 13:11
PM MAIL   Вверх
Earnest
Дата 23.4.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


--------------------
...
PM   Вверх
mastaflow
Дата 3.5.2008, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



сегодня пронаблюдал такой код (под бс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)
PM MAIL   Вверх
kosmonaFFFt
Дата 3.5.2008, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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

Код

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




--------------------
user posted image
PM MAIL ICQ   Вверх
Lycifer
Дата 7.7.2008, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



kosmonaFFFt - вопрос такой:

Цитата

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


Как это скампилируеются  smile ?     HANDLE Heap = GetProcessHeap(); переменная должнать быть статической . И вправду такой код пугает  smile 
PM MAIL ICQ   Вверх
kosmonaFFFt
Дата 7.7.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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


--------------------
user posted image
PM MAIL ICQ   Вверх
Ulysses4j
Дата 7.7.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


--------------------
Communication is critical to the job of a programmer.
C. Jazdzewski. Fatherly Advice To New Programmers
PM MAIL WWW   Вверх
Torsten
Дата 13.7.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Аленка
Цитата(Аленка @  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 вверху он находится по умолчанию над редактором), нужно лишь курсор на тип поместить чтобы увидеть как он определен.


--------------------
We have no begining, we have no end. We are infinite.
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

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


Лучше тогда уж error<id>::message, если конечно нет необходимости регистрировать ошибки в рантайме.
PM MAIL   Вверх
Kallikanzarid
Дата 12.11.2008, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(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 
PM MAIL   Вверх
bsa
Дата 12.11.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

Ты выравнивание имел в виду?
PM   Вверх
Kallikanzarid
Дата 13.11.2008, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(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 

Это сообщение отредактировал(а) Kallikanzarid - 13.11.2008, 03:53
PM MAIL   Вверх
nickless
Дата 14.11.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

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



Оно конечно работает (во всяком случае под 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
; ..."



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Kallikanzarid
Дата 14.11.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Это не противоречит коду выше. Скорее всего, компилятор просто учел выравнивание и преобразовал (&x)[index] к ((char*)&x) + 8*index). Хотя, конечно, не факт, что будет компилироваться везде.
PM MAIL   Вверх
Fire-Plug
Дата 19.1.2009, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(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 оператор...
PM MAIL   Вверх
Fire-Plug
Дата 19.1.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Ignat @ 18.3.2006,  06:52)
Это не вопрос, а скорее крик души.
. . .

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

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

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

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

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


depict1
****


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

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



В книге С++ 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;

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


--------------------
PM MAIL   Вверх
mes
Дата 25.1.2009, 18:08 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



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


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

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

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

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


Это сообщение отредактировал(а) mes - 25.1.2009, 18:20


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


depict1
****


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

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



Цитата(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



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


Эксперт
****


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

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



Цитата(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.
PM   Вверх
ДокторТуамОсес
Дата 10.6.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

А каким способом можно обойтись без свитча на большое кол-во вариантов?
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
just_geek
Дата 15.6.2009, 04:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



можно хэш ) в качестве значения указатель на функцию... но громоздко выйдет smile)
PM MAIL   Вверх
ДокторТуамОсес
Дата 15.6.2009, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

ИМХО, не вижу ничего не красивого в свитче со многими вариантами.
Всё очень читабельно и понятно
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
mes
Дата 19.6.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



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

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

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

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



--------------------
PM MAIL WWW   Вверх
ДокторТуамОсес
Дата 19.6.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ругаете свитч на 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));

--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
azesmcar
Дата 19.6.2009, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

А кто говорил что его читать надо? smile 
Вы еще бинарник попробуйте прочитать.
PM   Вверх
ДокторТуамОсес
Дата 19.6.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

Но ведь код из моего примера был написан кем-то.
Да не кем-то, а самой главной программистской фирмой - "Microsoft"
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
azesmcar
Дата 19.6.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

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

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

Хотите поглядеть на плохой код микрософта - загляните в MFC. 
PM   Вверх
nix_crash
Дата 20.6.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

 smile 
PM MAIL   Вверх
ДокторТуамОсес
Дата 21.6.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(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]

Это сообщение отредактировал(а) ДокторТуамОсес - 21.6.2009, 23:06
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
GoldFinch
Дата 21.6.2009, 23:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



вместо 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 пишет плохой код...


Это сообщение отредактировал(а) GoldFinch - 21.6.2009, 23:26
PM MAIL ICQ   Вверх
azesmcar
Дата 22.6.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

Какой еще оратор? Или это цитата? Тогда откуда?
PM   Вверх
jonie
Дата 22.6.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата(ДокторТуамОсес @ 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/ (не сочтите за рекламу) - смотрите его)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ДокторТуамОсес
Дата 22.6.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

В сообщение же было указано откуда цитата. А где находится список литературы - указано в моей подписи
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
azesmcar
Дата 23.6.2009, 08:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

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

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

А из нашего окна площадь Красная видна.
зачем мне список литературы? smile 
Хотя я понимаю ваше бурное и непреодолимое желание повысить посещаемость своего ресурса.
PM   Вверх
kosmonaFFFt
Дата 23.6.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
user posted image
PM MAIL ICQ   Вверх
azesmcar
Дата 23.6.2009, 09:36 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

Ах да, наверное я их должен был всех перечитать и наизусть запомнить. 
PM   Вверх
ДокторТуамОсес
Дата 23.6.2009, 17:53 (ссылка)    | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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

А вот я смысл Вашего "выпада" не понимаю.
Вас что не устраивает-то?
То что когда я кого-то цитирую, то привожу данные того,  кого я цитирую?
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
azesmcar
Дата 23.6.2009, 18:50 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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


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

Это сообщение отредактировал(а) azesmcar - 23.6.2009, 18:50
PM   Вверх
jonie
Дата 23.6.2009, 20:32 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
zim22
Дата 24.6.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



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

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

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


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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





--------------------
PM WWW ICQ Skype Jabber   Вверх
azesmcar
Дата 24.6.2009, 19:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

Да ради бога, пусть хоть Саттера критикует, только не надо в разговоре расчитывать на то, что я все это читал (или буду читать) smile 
PM   Вверх
zim22
Дата 25.6.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



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

вы пол жизни потеряли. его критика - это нечто! советую посмотреть  smile 
***
ДокторТуамОсес, в плане посещаемости сайт у вас ни ахти.
я вчера в 9 утра тему запостил. прошло 24 часа. никто в неё даже не зашёл... сколько мне с ответом ждать? smile


Это сообщение отредактировал(а) zim22 - 25.6.2009, 08:49


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


uploading...
****


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

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



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

иду смотреть smile 
PM   Вверх
JackYF
Дата 25.6.2009, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


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

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



ДокторТуамОсес, спасибо, посмеялся.

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


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


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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
zim22
Дата 25.6.2009, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



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

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


--------------------
PM MAIL   Вверх
ДокторТуамОсес
Дата 26.6.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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


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

Говорят, что "обещанного 3 года ждут"©  smile 
P.S. Ответил  smile 
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
MasterOfMuppets
Дата 29.3.2010, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

#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 с параметрами, передаваемыми в командной строке, и предусмотреть простенький хелп... Ну неужели так трудно...
PM MAIL   Вверх
Earnest
Дата 30.7.2010, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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



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


Опытный
**


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

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



Очень интересное мнение участников про 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.

Это сообщение отредактировал(а) Randajad - 18.3.2012, 12:33
PM MAIL   Вверх
Фантом
Дата 18.3.2012, 13:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

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



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

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

Код на C++, в котором в первой же строке константа определяется макросом... что тут еще можно думать?  smile 
PM   Вверх
Randajad
Дата 18.3.2012, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



И что же вы находите такого плохого в дефайнах препроцессора? smile
PM MAIL   Вверх
bsa
Дата 19.3.2012, 13:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А что тут думать? Вопрос находится в теме "как не надо писать код". Ответ очевиден.  smile 
Самый быстрый доступ к элементам в векторе. Самое быстрое удаление/вставка в середину в списке.
Если тебе не нужен случайный доступ, а достаточно последовательного, то лучше выбрать список.
Если тебе необходим случайный доступ, а размер элементов не больше указателя, то быстрее вектора вряд ли что будет.
Если ты используешь большие массивы больших элементов и случайный доступ необходим, то можно сделать нечто среднее, между списком и вектором. Т.е. в списке у тебя хранятся сами элементы, а в векторе хранятся указатели на них. Таким образом, при добавлении/удалении элементов, вектор будет работать только с простыми указателями (это быстро), а список с элементами. Пример такого контейнера - QList (Qt).
PM   Вверх
Randajad
Дата 25.3.2012, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это все хорошо, но необходим также доступ к элементам в стиле обычного массива. smile
Так что увы, ничего подходящего не нашел, кроме как самописный вариант.
PM MAIL   Вверх
bsa
Дата 26.3.2012, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

PM   Вверх
Randajad
Дата 27.3.2012, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я имел ввиду чтобы:
array<int> arr;
Было равно int arr[];
И все элементы стояли друг за другом в одном куске памяти. smile
PM MAIL   Вверх
baldina
Дата 27.3.2012, 10:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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


Опытный
**


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

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



Объекты внутри себя не хранят ссылок друг на друга, в этом вся фишка.
Выделение через new памяти для каждого объекта не хорошая идея потому, что размер объекта маленький, а их число порядка десятков тысяч. Таким образом из-за выравнивания и данных менеджера памяти получится слишком большое количество памяти "впустую".
PM MAIL   Вверх
baldina
Дата 14.4.2012, 21:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

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

PM MAIL   Вверх
heavix
Дата 15.5.2012, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

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


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


Опытный
**


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

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



Цитата(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:09


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
ТарасАтавин
Дата 29.8.2013, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


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


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
ТарасАтавин
Дата 30.8.2013, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Jeka178RUS
Дата 2.9.2013, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Чем же рекурсия так плоха? Накладные расходы на вызов функции, как мне кажется, не существенны (не берем в расчет критические отрасли, как контроллеры и пр.). Разве что отладка не удобна
PM MAIL   Вверх
bsa
Дата 2.9.2013, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


Опытный
**


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

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



Цитата(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() со всеми побочными явлениями без использования прямых вызовов.
 Явный вызов конструктора отлично заменяется присваиванием вспомогательного локального объекта, в котором напутать уже нельзя. А вот к чему приведёт двойной вызов конструктора для одного и того же динамического объёкта по указателю без тестов не разберёт и сам Страуструп.

Это сообщение отредактировал(а) ТарасАтавин - 3.9.2013, 05:59


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 3.9.2013, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

и вообще. Языки С/С++ очень гибкие. Поэтому на них очень легко получается совершать ошибки. Хочешь не совершать? Пиши на Ada.
PM   Вверх
Jeka178RUS
Дата 3.9.2013, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Замечательный пример "как не надо делать" я нашел в недрах Ericsson Labs: в одном файле утилиты для сжатия текстур  16 000 строк кода на С. Насколько нужно быть упоротым человеком чтобы так кодить?

Это сообщение отредактировал(а) Jeka178RUS - 3.9.2013, 12:38
PM MAIL   Вверх
ТарасАтавин
Дата 5.9.2013, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

Это сообщение отредактировал(а) ТарасАтавин - 5.9.2013, 11:27


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 5.9.2013, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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


Опытный
**


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

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



Цитата(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, больше ни в чём конструкторам/деструкторам не уступающие.

Это сообщение отредактировал(а) ТарасАтавин - 5.9.2013, 14:16


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 5.9.2013, 15:26 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

Так как кто-то книжки читать не любит (видимо на основании 13-ти летного опыта), то справочно сообщаю, что явно вызвать конструктор класса можно только используя так называемый "размещающий new" (указанный пример кода показывает на сколько это нетривиальная операция, по которой даже нельзя сказать, что это вызов конструктора). А операция MyClass() не является вызовом конструктора в чистом виде - это фактически создание временного объекта связанное с вызовом указанного конструктора.
PM   Вверх
ТарасАтавин
Дата 5.9.2013, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
akizelokro
Дата 5.9.2013, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



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


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ТарасАтавин
Дата 5.9.2013, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 5.9.2013, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ТарасАтавин @  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);
   но вариант выше короче (генерируемый код одинаков)
*/
}

PM   Вверх
ТарасАтавин
Дата 7.9.2013, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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 ни чем не отличается. Проверено.

Это сообщение отредактировал(а) ТарасАтавин - 7.9.2013, 19:21


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 9.9.2013, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ТарасАтавин @  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";
И объясни (главное себе), почему он не работает. 

PM   Вверх
ТарасАтавин
Дата 18.9.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


Это сообщение отредактировал(а) ТарасАтавин - 18.9.2013, 14:37


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
Guinness
Дата 18.9.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ТарасАтавин, вообще-то, это классика как нужно писать оператор присваивания, чтобы делать его "безопасным для исключений"(тут с термином мог ошибиться, не помню как у Саттера там классификация идет). Более того, таким образом мы гарантируем, что и копирующий конструктор и оператор присваивания у нас делают одно и тоже.
А если конструкция не привычна для восприятия, то нужно привыкать.
PM MAIL   Вверх
ТарасАтавин
Дата 18.9.2013, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Это сообщение отредактировал(а) ТарасАтавин - 18.9.2013, 18:58


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
mes
Дата 18.9.2013, 19:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(ТарасАтавин @  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 
ТарасАтавин, был тут на форуме уже докторКтоТоТам, тоже себя в грудь бил и кричал громче всех.. 
еще и книжки писал.. Вы еще не пробовали ? что ж ценный опыт пропадает ... 




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


Эксперт
****


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

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



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

немало ИТшных форумов, где он был заблокирован...  smile 
PM MAIL   Вверх
bsa
Дата 20.9.2013, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ТарасАтавин, расскажи, что делает конструкция MyClass(*this)?
PM   Вверх
azesmcar
Дата 24.9.2013, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

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

PM   Вверх
azesmcar
Дата 24.9.2013, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(ТарасАтавин @  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-ой строке, если он содержит мусор?

Это сообщение отредактировал(а) azesmcar - 24.9.2013, 16:04
PM   Вверх
ТарасАтавин
Дата 7.10.2013, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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:34


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
ТарасАтавин
Дата 7.10.2013, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Это сообщение отредактировал(а) ТарасАтавин - 7.10.2013, 18:48


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
bsa
Дата 9.10.2013, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ТарасАтавин, ты что к мелочам цепляешься? Тебе концепцию показывают. Естественно, что в нормальном коде должен быть и 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, а все остальное ляжет на плечи указателя.

PM   Вверх
ТарасАтавин
Дата 9.10.2013, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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



--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
baldina
Дата 9.10.2013, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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

это уже мозгоклюйство. ведь все всё поняли. 
PM MAIL   Вверх
bsa
Дата 10.10.2013, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ТарасАтавин @  9.10.2013,  13:34 Найти цитируемый пост)
то есть обмен параметра местами с мусором, а не о том, что именно это он и означает.
 smile 
Где ты мусор тут нашел? Оператор присваивания ВСЕГДА оперирует с инициализированными объектами. Если какой-то негодяй не инициализирует объекты в конструкторе, то это его проблемы. Дальнейшие рассуждения по поводу качества кода с ним можно не продолжать.
PM   Вверх
Lukkoye
Дата 4.1.2014, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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

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

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

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

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


PM MAIL   Вверх
baldina
Дата 4.1.2014, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

что касается замеров скорости, я не вижу подтверждения:
http://ideone.com/bAzcuQ
PM MAIL   Вверх
azesmcar
Дата 13.1.2014, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



baldina

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

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

Код

vector time = 570000
list time   = 2890000


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

Это сообщение отредактировал(а) azesmcar - 13.1.2014, 17:03
PM   Вверх
baldina
Дата 13.1.2014, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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

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

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

:off
для тех кто не все понял с первого раза.
тесты (наукообразно - эмпирический анализ) штука тонкая. что бы их проводить (и что бы интерпретировать готовые результаты) нужно учитывать самые различные факторы (все существенные).
что бы потом не стыдиться своих скороспелых заявлений об ошибках в компиляторах, развенчании мифов и т.п.
PM MAIL   Вверх
azesmcar
Дата 13.1.2014, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(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 штук (я делал замеры по скорости, но это было давно и точных цифр не помню) в вектор путем копирования его элементов в право (расширение), при условии, что у вектора достаточно резерва и он не реалокнется.

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

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

Это сообщение отредактировал(а) azesmcar - 13.1.2014, 18:53
PM   Вверх
nonaot
Дата 14.1.2014, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Страницы: (14) [Все] 1 2 3 ... Последняя »
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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