GregZ | ||||||
В былые времена лабораторных работ часто требовался вывод на консоль русских букв, ибо транслит и ломаный английский очень смущал преподов. Приходилось изворачиваться либо вставляя к месту и не к месту CharToOem либо (находились и такие) заменяя строки в тексте программы строками с использованием кодовой страницы 866. Но! Истина была как всегда рядом. Жаль я не додумался использовать Unicode раньше :)
Выводит на эран именно: Привет всем! а не: ¦ЁштхЄ тёхь! :) PS. Если найдутся люди, кому это интересно, могу продолжить. За время работы скопилась масса различных "ах если б молодость знала" ![]() PPS. Буду рад, если кто еще захочет поделиться опытом! |
||||||
ShadowS | ||||||
Да чего уж там выкладывай свои "ноу-хау", может и тебе кто нибудь чего полезного скинет | ||||||
GregZ | ||||||
Я разочарован в функторах, и функциональных адаптерах. Как думаете, что делает это код?
При условии, что:
Всего лишь вычисляет сумму Size всех элементов контейнера. Причем стандартными средствами STL это сделать нельзя. Использован функтор, расширяющий возможности стандартной библиотеки compose_f_gx_hy . Его описание можно найти в книге Николая Джосаттиса "The C++ Standard Library" . Это сообщение отредактировал GregZ - 21-04-2006 - 23:36 |
||||||
GregZ | ||||||
Извиняйте народ. Продолжения не будет. http://www.sexnarod.ru/index.php?showtopic=96226 |
||||||
GregZ | ||||||
Вот интересный вопрос, его задают на тестировании у нас в конторе: (вопрос с подвохом) Для каких вариантов наследования стандарт разрешает преобразование указателя базового класса на указатель производного при помощи static_cast?
1 public 2 protected 3 private 4 virtual public 5 virtual protected 6 virtual private Кто первый ответит правильно и объяснит ответ, не пожалею 20 сексо. Больше просто нет :). Ну и конечно репутацию! |
||||||
GregZ | ||||||
Судя по всему придётся отвечать самому. :)) Неужели ни кто не знает ответа? |
||||||
JeyLo | ||||||
А народу тяжело... :) Стандарт открывать или компилятор запускать - нечестно, а так не помнят... Это я про себя. :) |
||||||
GregZ | ||||||
Вопрос не даром с подвохом. Большинство современных компиляторов не дадут полностью правильного ответа на этот вопрос. В частности ошибутся VS8.0 и даже хваленый Comeau. Вот стандарт - другое дело. Но я совсем не против этого! Даже - за. Лишь бы правильно. |
||||||
GregZ | ||||||
Жаль ответа я так и не дождался. Вопрос вроде как был не очень сложный. Итак ответ: 4 virtual public 5 virtual protected 6 virtual private Эти варианты отметаются сразу. Реализация виртуального наследования в языке С++ не позволяет во время компиляции получить указатель производного класса из базового. Другое дело - во время выполнения, но для этого нужно использовать dynamic_cast. 1 public Ответ вполне однозначен. Преобразование возможно. 2 protected 3 private Самые сложные варианты. Как известно при закрытом и защищенном наследовании невозможно преобразовать даже указатель производного класса к указателю на базовый класс. Следовательно обратное преобразование (суть вопроса) вдвойне не имеет смысла, хотя практически (для компилятора) возможно. НО! Первое ограничение легко обойти. Достаточно открытой функции-члена в производном классе, возвращающей указатель на базовый класс. Что же тогда произойдет попытке обратного преобразования!? Компиляторы 8 студии и Comeau со спокойной душой допустят его. И... будут не правы. Лишь gcc корректно сообщит об ошибке преобразования. Дело в том, что стандарт явно запрещает преобразования от базового класса с производному, если невозможно преобразования от производного к базовому. :) Вот такое разночтение стандарта. ЗЫ. ISO/IEC 14882-2003 (Пункт 5.2.9 стих 5)
|
||||||
GregZ | ||||||
Да, не умею я конкурсы проводить :) вот в железном отделе отличный конкурс. ![]() 1. Перечислить производителей компиляторов (только С++). Не менее 3. :) 2. Перечислить ключевые слова языка программирования С++. Не менее 5. :) 3. На бумаге какого цвета напечатан стандарт 2003 адаптированный INCITS? :) ![]() ![]() ![]() |
||||||
JeyLo | ||||||
А че такие сложные вопросы? :) Папроще! |
||||||
GregZ | ||||||
Только чур не гуглить! :) | ||||||
tetro | ||||||
По поводу производителей компиляторов, кого мы считаем: у кого полностью свой, чей C++ frontend или чей backend? | ||||||
GregZ | ||||||
Без разницы. Лишь бы современные. :) |
||||||
Chara | ||||||
Я его распечатала на розовой... ![]() Причем буквами magenta. Симпатишненько получилось ![]() ![]() ![]() ![]() ![]() |
||||||
tetro | ||||||
Практически все производители специфических процессоров сразу лезут вперед: и HP и Sun и SGI (светлая ему память) не говоря о IBM ... | ||||||
GregZ | ||||||
Столкнулся с интересной особенность в языке С++. При перегрузке функции foo:
компилятор не может выбрать наиболее подходящую функцию. Для него они: indistinguishable conversion sequences. Т.е.:
В стандарте [C++03] п. 13.3.3.2 стих 3: Standard conversion sequence S1 is a better conversion sequence than standard conversion sequence S2 if: ... - S1 and S2 are reference bindings (8.5.3), and the types to which the references refer are the same type except for top-level cv-qualifiers, and the type to which the reference initialized by S2 refers is more cv-qualified than the type to which the reference initialized by S1 refers. ... |
||||||
Roman | ||||||
Не работает... |
||||||
GregZ | ||||||
Не компилируется, или работает некорректно? Если второе, что конкретно не так? |
||||||
Roman | ||||||
Не то выводит: "¦ЁштхЄ тёхь!". |
||||||
GregZ | ||||||
Быть такого не может. Компилятор какой? Локаль? |
||||||
Roman | ||||||
Borland Developer Studio 2006, винда ХР с СП2. |
||||||
GregZ | ||||||
А локаль какая у компилятора? Вывод осуществляете в консоль? |
||||||
Roman | ||||||
Да. |
||||||
GregZ | ||||||
Еще раз спрашиваю, какая локаль у компилятора? Как компилятор должен интерпретировать последовательность байтов L"Привет всем!", чтобы перевести их в юникод? Замени wcout на cout и убери юникод. Что получится? |
||||||
Roman | ||||||
Какая локаль не знаю. Получается 4060cb |
||||||
GregZ | ||||||
Юникод не убрал. Убери префик L у текста. Локаль определяется виндой в региональных стандартах. Язык программ, не поддерживающих юникод должен быть русским. |
||||||
Roman | ||||||
Локаль русская стоит. L убрал - всё тоже самое. ("¦ЁштхЄ тёхь!") |
||||||
GregZ | ||||||
Не знаю, что сказать. Компилятора Borland Developer Studio 2006 под рукой нет, проверить не могу. |
||||||
Nag_X | ||||||
#include <iostream> int main() { std::wcout.imbue(std::locale(".866")); std::wcout << L"Привет всем!" << std::endl; } При попытке компиляции с выводом в консоль(Builder 5), винда выдала сообщение о недостатке виртуальной памяти. |
||||||
GregZ | ||||||
Народ, могу посоветовать только сказать большое спасибо фирме Borland за отличные компиляторы. Приведеный мною код абсолютно корректен и соответствует стандарту. |
||||||
Roman | ||||||
Ну такого я никак не ожидал. Но меня больше беспокоит то, что при попытке установить Интербейс я увидел синий экран (при каждой попытке). Прямо в начале установки... Называется скачал новый Интербейс... |
||||||
GregZ | ||||||
Сегодня на работе вышел злободневный спор на тему выбора обертки для указателей, возвращаемых фабричными функциями. В результате сошлись только в одном - "сырые" указатели возвращать нельзя - чревато утечкой ресурсов. Что вполне естественно. Что касается оберток, одни убеждали использовать std::auto_ptr, уповая на ее наличие в стандартной библиотеке, быстроту работы и ключевую особенность копирования использующую "move semantics" называемую также "передачей владения". Другие предлагали использовать boost::shared_ptr или std::tr1::shared_ptr. Их аргументами являлись универсализм, возможность безболезненного "разделения" указателя несколькими сущностями одновременно, и поддержку собственной функции освобождения ресурса. У обеих оберток есть свои неисправимые преимущества и несомненные недостатки :) Что по этому вопросу скажет народ? |
||||||
GregZ | ||||||
Народ, как всегда, безмолствует... Будто сам с собой на форуме разговариваю. Так и тронуться недолго. Были отличные бойцы: JeyLo, tetro, AngeLR. Только пропали... |
||||||
JeyLo | ||||||
Народ еле думает. Жара... :) И самолеты крыльями машут... Мы STL не знаем, у нас свойная кросспроджект шаред либрари есть. В ней есть что-то типа auto_ptr. ![]() |