| Другое > Hard'n'Soft |
| Програмирование на C++ |
| << < (24/25) > >> |
| gepar:
--- Цитата: ColaKid ---gepar, эмм... почему? --- Конец цитаты --- Потому что надпись вверху using namespace XXX не делает то что ты дальше написал "в неймспейсе". Это только что-то типа указания "используй короткое имя для всего что лежит в XXX", иначе ты должен писать сам каждый раз какое пространство имён использовать, например XXX.method() , порой в неймспейсе есть другой неймспейс и получается без указаний using в коде что-то типа XXX::YYY::ZZZ.and_we_neeed_to_go_deeper(argument1,OOO::WWW::HH::EE::LL::obj); Ну а --- Цитата: ColaKid ---У меня объявление класса находится в неймспейсе --- Конец цитаты --- это значит что у тебя там что-то объявлено, а тебе захотелось внести ещё что-то в этот же namespace и ты начинаешь его опять описывать в другом файле (главное не продублировать ничего)... но это я так написал, ты пока этим голову сильно не забивай, а читай книгу свою по с++. Если ещё не выбрал книгу кстати то советую Дяейтелов. |
| ColaKid:
--- Цитата: gepar от 21 Март 2013, 00:21:47 --- Потому что надпись вверху using namespace XXX не делает то что ты дальше написал "в неймспейсе" --- Конец цитаты --- Ну, такое-то я знаю :) Я имел в виду примерно вот это: hpp: --- Код: ---namespace Bicycle { class log { log (); log( const log&) {}; log& operator = ( const log&) {}; public: static log& Instance () { static log logInstance; return logInstance; } void Enable (); <...> log& operator << ( const std::wstring& wstr) throw ( log_error_t); log& operator << ( const int& i) throw ( log_error_t); }; // class } // namespace Bicycle --- Конец кода --- cpp: --- Код: --- #include "log.hpp" using namespace Bicycle; <...> Bicycle::log& log::operator << ( const int& i) throw ( log_error_t) { if ( enabled) { std::FILE *fp = 0; if ( _wfopen_s( &fp, wstrFileName.c_str(), L"a, ccs=UTF-16LE")) { throw log_open_file_error; } else { std::wostringstream String; String << i; std::wstring wstrBuf = String.str(); std::fputws( wstrBuf.c_str(), fp); std::fflush( fp); if ( std::fclose( fp)) { throw log_close_file_error; } } // else wfopen_s } // if enabled return *this; } // int operator < --- Конец кода --- У меня, кстати, черновой вариант моей утилитки уже готов, его можно скачать по адресу http://disk.yandex.ru/public/?hash=gfWiMN4WprWzPwsYm3G/EGjBOnIZB370aEplafc0D8U%3D. В ближайшее время планирую причесать немножко код и выложить куда-нибудь. |
| gepar:
--- Цитата: ColaKid --- В ближайшее время планирую причесать немножко код и выложить куда-нибудь. --- Конец цитаты --- От консольных утилит кончают только гики, так её считай никто и запускать не захочет только услышит слово "консольная". |
| ColaKid:
--- Цитата: gepar от 21 Март 2013, 00:41:49 --- От консольных утилит кончают только гики, так её считай никто и запускать не захочет только услышит слово "консольная". --- Конец цитаты --- О том, что она консольная, впервые я услышал от тебя сейчас) |
| gepar:
ColaKid, а, ну я не смотрел, просто ты выложил куски кода где нет никаких упоминаний о подключении чего-либо для графики вот я и решил так ) |
| ColaKid:
--- Цитата: gepar от 21 Март 2013, 01:05:03 ---ColaKid, а, ну я не смотрел, просто ты выложил куски кода где нет никаких упоминаний о подключении чего-либо для графики вот я и решил так ) --- Конец цитаты --- Всё разбито на модули же) |
| ColaKid:
Уже стыдно за свой говнокод :D log_error_t — надо было до такого додуматься. Такие имена типов зарезервированы для разработчиков компиляторов. Не повторяйте чужих ошибок :) |
| Heidr:
В виндовсе русский текст из файлов выводится нормально, только если файл в кодировке CP1251, а в линуксе - только если в UTF-8. Можно ли что-нибудь сделать, чтобы и там, и там русские буквы читались? Желательно, чтобы текстовый файл остался в UTF-8. А ещё в виндовсе есть функция Sleep(), которой нет в линуксе, а в линуксе - nanosleep(), которой нет в виндовсе. Есть ли какая-нибудь общая для них функция задержки? Библиотеки со временем меняются, что ли? Порылся сейчас в своих старых программах 6-8-летней давности, которые писал в Borland C++ 3.1, там обнаружил, что пользовался многими функциями, которые сейчас куда-то пропали. Например, random() и randomize(). |
| gepar:
--- Цитата: Heidr ---А ещё в виндовсе есть функция Sleep(), которой нет в линуксе, а в линуксе - nanosleep(), которой нет в виндовсе. Есть ли какая-нибудь общая для них функция задержки? --- Конец цитаты --- std::this_thread::sleep_for(chrono::milliseconds(1000)); --- Цитата: Heidr ---Библиотеки со временем меняются, что ли? --- Конец цитаты --- Дополняются. --- Цитата: Heidr ---там обнаружил, что пользовался многими функциями, которые сейчас куда-то пропали. --- Конец цитаты --- С разными компиляторами в комплекте идут свои определения и процедуры помимо тех что нужны по стандарту, приведённые тобой примеры в стандарт не входят. --- Цитата: Heidr ---В виндовсе русский текст из файлов выводится нормально, только если файл в кодировке CP1251 --- Конец цитаты --- Можешь поиграться с кодировкой в настройках консоли в windows. |
| Infinity:
--- Цитата: Heidr от 17 Июль 2014, 08:06:25 ---В виндовсе русский текст из файлов выводится нормально, только если файл в кодировке CP1251, а в линуксе - только если в UTF-8. --- Конец цитаты --- Не фантазируй. В Линуксе нормально и 1251 и утф-8 показывается. Начиная с вин7, дефолтная кодировка в винде - утф-8. Так что можешь просто сразу делать все в нормальной кодировке (утф-8). Для консольных утилит в винде в терминале можешь выбирать эти параметры все - правой кнопкой мыши тык на значок окна слева. |
| Heidr:
--- Цитата: gepar от 17 Июль 2014, 09:57:57 --- std::this_thread::sleep_for(chrono::milliseconds(1000)); --- Конец цитаты --- Компилятор заставил дописать в опции -std=c++11, так и должно быть? Пользуюсь tdm-gcc-4.8.1-3. Но работает, спасибо! --- Цитата: gepar от 17 Июль 2014, 09:57:57 --- Можешь поиграться с кодировкой в настройках консоли в windows. --- Конец цитаты --- Тогда придётся менять настройки консоли на каждом компьютере, где захочется запустить программу. А это не годится. Ещё я запутался в постфиксных операторах x++ и x--. С префиксными вроде понятно - прежде чем выполнить действие с переменными, сначала меняется значение той, к которой слева приписаны ++ или --, а потом всё как обычно. Вот два примера: --- Код: ---x = 10; answer = x + (x + x--) + (x + x++); --- Конец кода --- --- Код: ---x = 5; answer = (--x + 2) + (x-- + 2) * (x + 2) - (x + 2); --- Конец кода --- Недавно у меня стоял GCC версии 4.7.1-2. Ответы были 50 и 36 соответственно. Выходило так, что выражение вычислялось, будто вместо x++ и x-- стоял просто x, а значение x менялось в самом конце. Обновил компилятор, и стало 47 и 31 :wacko:. Как так? --- Цитата: Infinity от 17 Июль 2014, 10:31:09 ---Не фантазируй. В Линуксе нормально и 1251 и утф-8 показывается. Начиная с вин7, дефолтная кодировка в винде - утф-8. Так что можешь просто сразу делать все в нормальной кодировке (утф-8). --- Конец цитаты --- Добавлено позже: А ещё я сейчас обнаружил, что в виндовсе я работал с исходниками в windows-1251, так как открывал их из примеров, а IDE создаёт новые в UTF-8. И если в первых в консоли выводились русские буквы после использования функции setlocale (LC_ALL, "Russian") (не из файла, а просто через cout и printf ()), то во вторых - уже нет. 2014 год на дворе, а такие проблемы с кодировками. |
| GManiac:
--- Цитата: Heidr от 17 Июль 2014, 11:05:49 ---Вот два примера: --- Код: ---x = 10; answer = x + (x + x--) + (x + x++); --- Конец кода --- --- Код: ---x = 5; answer = (--x + 2) + (x-- + 2) * (x + 2) - (x + 2); --- Конец кода --- --- Конец цитаты --- Так верстают пишут только мудаки. Не пиши такой код, и будет тебе счастье. Максимум как инкремент указателя массива. Например, в сеговском процессоре стек реализован вот так (и вообще все инкремент/декрементные операции над массивами): mas[ p++ ] = value; value = mas[--p]; А в интеловском так (ЕМНИП): mas[ ++p ] = value; value = mas[p--] Добавлено позже: Я догадываюсь, что это примеры из книги, но ИМХО, вопрос, как оно там будет на самом деле по стандарту и в разных компиляторах (результат разный бывает), не стого того, чтобы им заморачиваться. |
| gepar:
--- Цитата: Heidr ---Тогда придётся менять настройки консоли на каждом компьютере, где захочется запустить программу. А это не годится. --- Конец цитаты --- Годиться потому что консоль это так для тебя для отладки, а если ты надумаешь распространять что-то всё равно придётся лезть на QT и т.д, ну а для особо желающих поработать с консолью есть SetConsoleOutputCP() засунутый в ifdef и с компиляцией под виндовс онли. --- Цитата: Heidr ---2014 год на дворе, а такие проблемы с кодировками. --- Конец цитаты --- Потому что это никому ненужно, для зануд сделали UTF wchar и wcout, можешь их попробовать, но я опять же таки повторюсь: это никому не нужно и даже тебе. Программки в консоли это так для гиков либо какая-то мелочь с параметрами которую сделать не на английском грех просто таки. |
| Heidr:
Я же только учусь программированию, пока мне и консоли хватает. А с оконным интерфейсом проблем с кодировками не будет? --- Цитата: GManiac от 17 Июль 2014, 12:35:49 ---Я догадываюсь, что это примеры из книги, но ИМХО, вопрос, как оно там будет на самом деле по стандарту и в разных компиляторах (результат разный бывает), не стого того, чтобы им заморачиваться. --- Конец цитаты --- Это примеры с сайта GameTutorials.com. Там программирование объясняется исходниками с подробными комментариями. Раньше доступ к ним был платным, но на днях стал бесплатным, вот я и решил поизучать Си++. Буду делать на нём World of Warcraft. Но то, что разные компиляторы по-разному определяют последовательность вычислений, тем более разные версии одного компилятора - это полный ппц, на мой взгляд. За 40 лет так с этим и не определились? А если в ядре линукса много ++ и --, то при компиляции в новом GCC разработчикам придётся лопатить миллионы строк кода, чтобы всё менять? Я и сам не пользуюсь ++ и -- в арифметических выражениях, но иногда с ними код короче и интересней смотрится. Вот, например, возведение a в степень n: --- Код: ---int result; while (n--) result *= a; return result; --- Конец кода --- Обнаружил ещё кое-что. Если в виндовсе считать строку с кириллицей в консоли, то, если setlocale () не использовалась, строка выведется потом нормально, а если использовалась, то нет. Получается, можно или вводить русские буквы, или выводить, но не одновременно? :-\ |
| ColaKid:
--- Цитата: Heidr от 17 Июль 2014, 11:05:49 ---Компилятор заставил дописать в опции -std=c++11, так и должно быть? --- Конец цитаты --- Да, потому что поддержка потоков появилась только в новом стандарте. --- Цитата: Heidr от 17 Июль 2014, 11:05:49 ---Ещё я запутался в постфиксных операторах x++ и x--. С префиксными вроде понятно - прежде чем выполнить действие с переменными, сначала меняется значение той, к которой слева приписаны ++ или --, а потом всё как обычно. Вот два примера: --- Код: ---x = 10; answer = x + (x + x--) + (x + x++); --- Конец кода --- --- Конец цитаты --- Это undefined behavior. --- Цитата: Infinity от 17 Июль 2014, 10:31:09 ---Начиная с вин7, дефолтная кодировка в винде - утф-8. --- Конец цитаты --- Откуда инфа? В NT, вроде, UTF-16 LE всегда был. |
| GManiac:
--- Цитата: Heidr от 17 Июль 2014, 13:13:59 ---Но то, что разные компиляторы по-разному определяют последовательность вычислений, тем более разные версии одного компилятора - это полный ппц, на мой взгляд. За 40 лет так с этим и не определились? А если в ядре линукса много ++ и --, то при компиляции в новом GCC разработчикам придётся лопатить миллионы строк кода, чтобы всё менять? --- Конец цитаты --- Всякие best practices и правила хорошего тона в программировании не просто так придумали. Машина создана для человека, а не человек для машины, поэтому код должен быть в первую очередь как можно более понятным и легкочитаемым, потом ещё переносимым и совместимым. Можно надеяться, что ядро писали не студенты, и он к этим стандартам не чувствителен. Достаточно того, что собрать почти любой чужой проект на сях, не имея конкретно той среды/компиляторов/либ той версии с теми же настройками/опциями/ключами, какие были у автором в момент билда, обычно дерьмовенькое занятие с кучей геморроя. --- Цитата ---Я и сам не пользуюсь ++ и -- в арифметических выражениях, но иногда с ними код короче и интересней смотрится. Вот, например, возведение a в степень n: --- Код: ---int result; while (n--) result *= a; return result; --- Конец кода --- --- Конец цитаты --- Во-во, а теперь представь, что ты видишь этот код впервые, потому что лопатишь чей-то чужой говнопроект. И тут надо сидеть вкуривать, как оно работает и почему. Или почему не работает. Или почему то работает, то нет, что чаще всего бывает. Например, этот код чувствителен к положению --. Надо ещё помнить, что выражение в скобках действительно, пока n не равно (не "больше", а "не равно"). Если бы это был код вычисления факториала, т.е. умножение шло на n, там бы ещё могло на 0 умножиться. Уже три возможности запутаться в трёх строчках. Вот этот код намного проще и понятней. Достаточно запомнить один раз на всю жизнь, что для прогона цикла for в N раз от 0 надо ставить знак < N. От единицы <=. Чаще пишут от 0, потому что индексация массивов начинается с 0. --- Код: ---for (int i = 0; i < n; i++ ) result *= a; --- Конец кода --- |
| MetalliC:
Heidr, на счет ++ и -- читай http://www.viva64.com/ru/d/0162/ или вику просто C/C++ позволяют делать много всякого, чего в других языках нельзя, и предполагается что программер чётко знает что он делает. если же не знает - да, получается быдлокод, там работающий а сям не работающий. и x + (x + x--) + (x + x++) как раз годный пример такого индусизма :) |
| Heidr:
Значит, нормальные люди всё-таки не пользуются ++ и -- в составе выражений? А то я боялся, что все постоянно только их и используют, один я не в теме. Так как быть с кириллицей в Windows? Получается, не видать человечеству консольного World of Warcraft на русском? И вот ещё непонятное. В примере на том сайте есть второй способ чтения из файла, там такое: --- Код: ---ifstream fileIn("GT.txt"); if(!fileIn) return 1; string strBuff; while(!fileIn.eof()) { fileIn >> strBuff; // Here we read in a word cout << strBuff; // Now we're simply regurgitating the word we read in to the screen cout << " "; } fileIn.close(); --- Конец кода --- В файле GT.txt одна строчка: This tutorial was brought to by GameTutorials. Последнее слово почему-то выводится дважды. Почему? Странные там исходники, написано, что всё проверено на работоспособность последней вижуалстудией, но в GCC часто то библиотека нужная оказывается неподключённой, то значение не задефайнено. Я думал, что хоть компиляторы разные, но библиотеки-то уж одинаковые. |
| cviten:
Heidr, , легче использовать --- Код: ---getline(fileIn,strBuff); --- Конец кода --- Он читает всё строку целиком, а не по словам. Мне больше нравится этот туториал http://www.cplusplus.com/doc/tutorial/ , но это дело вкуса. Зато тут есть полный Reference по всем стандартным библиотекам. |
| gepar:
--- Цитата: Heidr ---Получается, можно или вводить русские буквы, или выводить, но не одновременно? --- Конец цитаты --- Получается кому-то надо разобраться с кодировками один раз и больше не строить предположений http://habrahabr.ru/post/158895/ --- Цитата: Heidr ---Последнее слово почему-то выводится дважды. --- Конец цитаты --- Потому что в конце не было чего считывать и оператор >> ничего не сделал с старым содержимым (никто же не говорил что если не будет чего считывать то строка станет пустой, верно?). |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |