Другое > 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 ---Последнее слово почему-то выводится дважды.
--- Конец цитаты ---

Потому что в конце не было чего считывать и оператор >> ничего не сделал с старым содержимым (никто же не говорил что если не будет чего считывать то строка станет пустой, верно?).
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии