Страница 2 из 4

Re: Не получается преобразование нуль-терминальной UTF8 в std::wstring

Добавлено: 13 дек 2015, 19:08
Absurd
Сионист писал(а):Какой константы? У Вас их вообще нет.
Обычно в С++98 целочисленные константы задавали через enum, a плавающие - через #define. Сейчас появился constexpr и прочие радости жизни. А const для таких вещей - никому не нужное унылое говно.
Сионист писал(а):
Если не устраивает дефолт размер можно передать явно через параметр шаблона.
А где его вообще брать?
Эмпирически по результатам перформанс тестов.
Сионист писал(а):
unique_ptr - уникальный указатель, а не значение.
А где там вообще ptr то?
Ну то есть про автовыведение типов ты ничего не знаешь.
Сионист писал(а):
Деструктор unique_ptr делает delete[] для массивов, ничего непонятного тут нет
А где массив?
make_unique создает массив.

Re: Не получается преобразование нуль-терминальной UTF8 в std::wstring

Добавлено: 13 дек 2015, 19:21
Сионист
Эйси. А как Вы побороли то, что MultiByteToWideChar возвращает не правильную длину, когда на входе смешанная строка? В моём случае было 27 вместо 23. Что то я не улавливаю.

Re: Не получается преобразование нуль-терминальной UTF8 в std::wstring

Добавлено: 13 дек 2015, 19:32
Absurd
Эйси. А как Вы побороли то, что MultiByteToWideChar возвращает не правильную длину, когда на входе смешанная строка? В моём случае было 27 вместо 23. Что то я не улавливаю.
Приведи пример строчки. Может у меня ошибка, а я и не знаю.

Добавлено: 14 дек 2015, 06:36
Сионист
Дефайн не контролирует видимость. Что может быть хуже? А енам вообще создаёт не константу, а тип.
Absurd писал(а):Приведи пример строчки.
"Система>Как Вас зовут?".

Re: Не получается преобразование нуль-терминальной UTF8 в std::wstring

Добавлено: 14 дек 2015, 13:43
Absurd
"Система>Как Вас зовут?".
22 чара всего, 18 чаров кириллицей, 4 чара ANSI. В UTF8 это 18 * 2 + 4 = 40. Обе функции возвращают то что ожидалось - WideCharToMultiByte вернула 40, MultiByteToWideChar вернула 22. Несложно же пройтись дебаггером.
Дефайн не контролирует видимость. Что может быть хуже?
Хуже когда задача числодробильная, а компилятор генерирует плохой код для const float. Поэтому в стандарте кодирования движка Unreal к конце 90-х плавающие константы определялись через дефайн, например. Так и повелось с тех пор пока не появились более удобные средства для работы с плавающими константами.
А енам вообще создаёт не константу, а тип
Какой тип создает анонимный enum?

Добавлено: 14 дек 2015, 13:58
Сионист
Я и прошёл дебагером, там и было 27. Правильное значение 23. Терминальный ноль куда дели?
Хуже когда задача числодробильная, а компилятор генерирует плохой код для const float. Поэтому в стандарте кодирования движка Unreal к конце 90-х плавающие константы определялись через дефайн, например. Так и повелось с тех пор пока не появились более удобные средства для работы с плавающими константами.
Каким бы плохим ни был код, это не сопоставимо лучше, чем напороться на макрос за пределами области видимости.

Код: Выделить всё

void f1()
{
 const float x=20.3;
}
void f2()
{
 const float x=30.64;
}
, а теперь забываем прописать строку

Код: Выделить всё

const double x=30.64;
и получаем затык при коммпиляции.

Код: Выделить всё

void f1()
{
 #define x=20.3;
}
void f2()
{
 #define x=30.64;
}
. А вот теперь мало того, что если забыть

Код: Выделить всё

#define x=30.64;
, то компилятор это проглотит, так ещё попробуйте на вскидку сказать, не будет ли здесь конфликта в случае, когда строка не забыта. Я вот не скажу, так как первый дефайн распространяется на f2. Код с const на столько испортить не возможно в принципе. Уж лучше даже

Код: Выделить всё

void f1()
{
 float x=20.3;
}
void f2()
{
 float x=30.64;
}
.
Какой тип создает анонимный enum?
То, что им невозможно пользоваться, сути не меняет.

Re: Не получается преобразование нуль-терминальной UTF8 в std::wstring

Добавлено: 14 дек 2015, 14:18
Absurd
Не мог он вернуть 27
Изображение
Правильное значение 23.
Нет, оно неправильное. Вызовы MultiByteToWideChar() терминальные нулевые байты не используют, так как длина им передана четвертым параметром. Явное указание длины спасает он дополнительного неявного strlen() внутри MultiByteToWideChar(). strlen(), как мы знаем, имеет стоимость O(N) где N-длина строки. Конструктору возвращаемого std::wstring() тоже этот нулевой байт не нужен если указан размер. А он указан. Это избавляет нас от еще одного неявного wcslen().

Добавлено: 14 дек 2015, 14:52
Сионист
ет, оно неправильное. Вызовы MultiByteToWideChar() терминальные нулевые байты не используют, так как длина им передана четвертым параметром.
Так он то у меня тоже у учётом терминального ноля.
Конструктору возвращаемого std::wstring() тоже этот нулевой байт не нужен если указан размер. А он указан.
Нельзя ли это место по подробней?

Re: Не получается преобразование нуль-терминальной UTF8 в std::wstring

Добавлено: 14 дек 2015, 15:01
Absurd
Каким бы плохим ни был код, это не сопоставимо лучше, чем напороться на макрос за пределами области видимости.
Поэтому макросам дают такие имена чтобы не напарываться

Код: Выделить всё

void f1()
{
 const float x=20.3;
}
void f2()
{
 const float x=30.64;
}
Зачем тут вообще ставить const? Стек вообще RW память, const в нем нельзя реализовать физически. Защитить себя от себя? Не всегда получится.

Код: Выделить всё

struct Q {
  float nefarious[1];
  const float x = 20.3;
};

int main()
{
  Q q;
  // q.x = 666.0f; Не компилируется
  q.nefarious[1] = 666.0f;
  std::cout << q.x;
  return 0;
}
У меня выводит 666. Конечно тут все зависит от выравнивания, так что могут быть варианты.

И да, в современном С++ надо писать constexpr float x = 20.3, так что данная дискуссия имеет целью обсуждени чисто исторических вопросов.

Re: Не получается преобразование нуль-терминальной UTF8 в std::wstring

Добавлено: 14 дек 2015, 15:04
Absurd
Нельзя ли это место по подробней?
А что, по коду не видно какой конкретно конструктор std::wstring используется? По моему очевидно что std::wstring(const wchar_t*, std::size_t)