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

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

13 дек 2015, 19:08

Сионист писал(а):Какой константы? У Вас их вообще нет.
Обычно в С++98 целочисленные константы задавали через enum, a плавающие - через #define. Сейчас появился constexpr и прочие радости жизни. А const для таких вещей - никому не нужное унылое говно.
Сионист писал(а):
Если не устраивает дефолт размер можно передать явно через параметр шаблона.
А где его вообще брать?
Эмпирически по результатам перформанс тестов.
Сионист писал(а):
unique_ptr - уникальный указатель, а не значение.
А где там вообще ptr то?
Ну то есть про автовыведение типов ты ничего не знаешь.
Сионист писал(а):
Деструктор unique_ptr делает delete[] для массивов, ничего непонятного тут нет
А где массив?
make_unique создает массив.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

13 дек 2015, 19:21

Эйси. А как Вы побороли то, что MultiByteToWideChar возвращает не правильную длину, когда на входе смешанная строка? В моём случае было 27 вместо 23. Что то я не улавливаю.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

13 дек 2015, 19:32

Эйси. А как Вы побороли то, что MultiByteToWideChar возвращает не правильную длину, когда на входе смешанная строка? В моём случае было 27 вместо 23. Что то я не улавливаю.
Приведи пример строчки. Может у меня ошибка, а я и не знаю.
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

14 дек 2015, 06:36

Дефайн не контролирует видимость. Что может быть хуже? А енам вообще создаёт не константу, а тип.
Absurd писал(а):Приведи пример строчки.
"Система>Как Вас зовут?".
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

14 дек 2015, 13:43

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

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?
То, что им невозможно пользоваться, сути не меняет.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

14 дек 2015, 14:18

Не мог он вернуть 27
Изображение
Правильное значение 23.
Нет, оно неправильное. Вызовы MultiByteToWideChar() терминальные нулевые байты не используют, так как длина им передана четвертым параметром. Явное указание длины спасает он дополнительного неявного strlen() внутри MultiByteToWideChar(). strlen(), как мы знаем, имеет стоимость O(N) где N-длина строки. Конструктору возвращаемого std::wstring() тоже этот нулевой байт не нужен если указан размер. А он указан. Это избавляет нас от еще одного неявного wcslen().
2B OR NOT(2B) = FF
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

14 дек 2015, 14:52

ет, оно неправильное. Вызовы MultiByteToWideChar() терминальные нулевые байты не используют, так как длина им передана четвертым параметром.
Так он то у меня тоже у учётом терминального ноля.
Конструктору возвращаемого std::wstring() тоже этот нулевой байт не нужен если указан размер. А он указан.
Нельзя ли это место по подробней?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

14 дек 2015, 15:01

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

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

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, так что данная дискуссия имеет целью обсуждени чисто исторических вопросов.
2B OR NOT(2B) = FF
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

14 дек 2015, 15:04

Нельзя ли это место по подробней?
А что, по коду не видно какой конкретно конструктор std::wstring используется? По моему очевидно что std::wstring(const wchar_t*, std::size_t)
2B OR NOT(2B) = FF
Ответить