+ Ответить в теме
Страница 2 из 4
ПерваяПервая 1 2 3 4 ПоследняяПоследняя
Показано с 11 по 20 из 37

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

  1. #11
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    39
    Сообщений
    1,213
    Вес репутации
    17

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

    Цитата Сообщение от Сионист Посмотреть сообщение
    Какой константы? У Вас их вообще нет.
    Обычно в С++98 целочисленные константы задавали через enum, a плавающие - через #define. Сейчас появился constexpr и прочие радости жизни. А const для таких вещей - никому не нужное унылое говно.

    Цитата Сообщение от Сионист Посмотреть сообщение
    Если не устраивает дефолт размер можно передать явно через параметр шаблона.
    А где его вообще брать?
    Эмпирически по результатам перформанс тестов.

    Цитата Сообщение от Сионист Посмотреть сообщение
    unique_ptr - уникальный указатель, а не значение.
    А где там вообще ptr то?
    Ну то есть про автовыведение типов ты ничего не знаешь.

    Цитата Сообщение от Сионист Посмотреть сообщение
    Деструктор unique_ptr делает delete[] для массивов, ничего непонятного тут нет
    А где массив?
    make_unique создает массив.
    2B OR NOT(2B) = FF

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #12
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

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

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

  4. #13
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    39
    Сообщений
    1,213
    Вес репутации
    17

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

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

  5. #14
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию

    Дефайн не контролирует видимость. Что может быть хуже? А енам вообще создаёт не константу, а тип.

    Цитата Сообщение от Absurd Посмотреть сообщение
    Приведи пример строчки.
    "Система>Как Вас зовут?".
    Последний раз редактировалось Romeo; 14.12.2015 в 11:12.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  6. #15
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    39
    Сообщений
    1,213
    Вес репутации
    17

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

    "Система>Как Вас зовут?".
    22 чара всего, 18 чаров кириллицей, 4 чара ANSI. В UTF8 это 18 * 2 + 4 = 40. Обе функции возвращают то что ожидалось - WideCharToMultiByte вернула 40, MultiByteToWideChar вернула 22. Несложно же пройтись дебаггером.

    Дефайн не контролирует видимость. Что может быть хуже?
    Хуже когда задача числодробильная, а компилятор генерирует плохой код для const float. Поэтому в стандарте кодирования движка Unreal к конце 90-х плавающие константы определялись через дефайн, например. Так и повелось с тех пор пока не появились более удобные средства для работы с плавающими константами.
    А енам вообще создаёт не константу, а тип
    Какой тип создает анонимный enum?
    2B OR NOT(2B) = FF

  7. #16
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию

    Я и прошёл дебагером, там и было 27. Правильное значение 23. Терминальный ноль куда дели?

    Хуже когда задача числодробильная, а компилятор генерирует плохой код для const float. Поэтому в стандарте кодирования движка Unreal к конце 90-х плавающие константы определялись через дефайн, например. Так и повелось с тех пор пока не появились более удобные средства для работы с плавающими константами.
    Каким бы плохим ни был код, это не сопоставимо лучше, чем напороться на макрос за пределами области видимости.
    Код cpp:
    1. void f1()
    2. {
    3.  const float x=20.3;
    4. }
    5. void f2()
    6. {
    7.  const float x=30.64;
    8. }
    , а теперь забываем прописать строку
    Код :
    1. const double x=30.64;
    и получаем затык при коммпиляции.
    Код cpp:
    1. void f1()
    2. {
    3.  #define x=20.3;
    4. }
    5. void f2()
    6. {
    7.  #define x=30.64;
    8. }
    . А вот теперь мало того, что если забыть
    Код :
    1. #define x=30.64;
    , то компилятор это проглотит, так ещё попробуйте на вскидку сказать, не будет ли здесь конфликта в случае, когда строка не забыта. Я вот не скажу, так как первый дефайн распространяется на f2. Код с const на столько испортить не возможно в принципе. Уж лучше даже
    Код cpp:
    1. void f1()
    2. {
    3.  float x=20.3;
    4. }
    5. void f2()
    6. {
    7.  float x=30.64;
    8. }
    .

    Какой тип создает анонимный enum?
    То, что им невозможно пользоваться, сути не меняет.
    Последний раз редактировалось Romeo; 14.12.2015 в 14:21.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  8. #17
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    39
    Сообщений
    1,213
    Вес репутации
    17

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

    Не мог он вернуть 27


    Правильное значение 23.
    Нет, оно неправильное. Вызовы MultiByteToWideChar() терминальные нулевые байты не используют, так как длина им передана четвертым параметром. Явное указание длины спасает он дополнительного неявного strlen() внутри MultiByteToWideChar(). strlen(), как мы знаем, имеет стоимость O(N) где N-длина строки. Конструктору возвращаемого std::wstring() тоже этот нулевой байт не нужен если указан размер. А он указан. Это избавляет нас от еще одного неявного wcslen().
    Последний раз редактировалось Absurd; 14.12.2015 в 14:25.
    2B OR NOT(2B) = FF

  9. #18
    Недохакер system architect Сионист is an unknown quantity at this point Аватар для Сионист
    Регистрация
    31.03.2014
    Сообщений
    1,078
    Вес репутации
    0

    По умолчанию

    ет, оно неправильное. Вызовы MultiByteToWideChar() терминальные нулевые байты не используют, так как длина им передана четвертым параметром.
    Так он то у меня тоже у учётом терминального ноля.

    Конструктору возвращаемого std::wstring() тоже этот нулевой байт не нужен если указан размер. А он указан.
    Нельзя ли это место по подробней?
    Последний раз редактировалось Romeo; 14.12.2015 в 15:25.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

  10. #19
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    39
    Сообщений
    1,213
    Вес репутации
    17

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

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

    Код cpp:
    1. void f1()
    2. {
    3.  const float x=20.3;
    4. }
    5. void f2()
    6. {
    7.  const float x=30.64;
    8. }

    Зачем тут вообще ставить const? Стек вообще RW память, const в нем нельзя реализовать физически. Защитить себя от себя? Не всегда получится.

    Код cpp:
    1. struct Q {
    2.   float nefarious[1];
    3.   const float x = 20.3;
    4. };
    5.  
    6. int main()
    7. {
    8.   Q q;
    9.   // q.x = 666.0f; Не компилируется
    10.   q.nefarious[1] = 666.0f;
    11.   std::cout << q.x;
    12.   return 0;
    13. }
    У меня выводит 666. Конечно тут все зависит от выравнивания, так что могут быть варианты.

    И да, в современном С++ надо писать constexpr float x = 20.3, так что данная дискуссия имеет целью обсуждени чисто исторических вопросов.
    Последний раз редактировалось Absurd; 14.12.2015 в 16:55.
    2B OR NOT(2B) = FF

  11. #20
    Moderator Куратор
    system architect
    Absurd is on a distinguished road
    Регистрация
    26.02.2004
    Адрес
    Pietari, Venäjä
    Возраст
    39
    Сообщений
    1,213
    Вес репутации
    17

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

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

+ Ответить в теме
Страница 2 из 4
ПерваяПервая 1 2 3 4 ПоследняяПоследняя

Похожие темы

  1. не получается переехать на IIS
    Нужна помощь по перенсу CMS с Apache на IIS. Для корректной работы CMS необходима поддержка rewrite mode. IIS его по умолчанию не поддерживает,...
    от Luca в разделе Apache, IIS...
  2. UTF8 to Win-1251
    Понимаю, что по этому поводу написано множество, однако... На самом обычном ASP (без dotNet) нужно преобразовать строку из GET запроса, получаемого...
    от Pervoklasnik в разделе Perl, PHP, ASP ...
  3. QueryInterface - не получается
    Есть такая штука: Frames:=WebBrowser.OleObject.Document.Frames; for i:=0 to Frames.Length-1 do If Frames.item(i).name='...' then ...
    от Blood_Magic в разделе Delphi и Pascal
  4. UTF8->ANSI
    Как перевести из кодировки UTF8 в ANSI. Причём вот есть код: WCHAR names1[30]; WCHAR names[] = L"Привет"; const int nSize =...
    от Alezis в разделе C и C++
  5. MySql и UTF8 и много чего ещё...
    Люди научите. Скачал недавно MySQL 4.1.12a. Там говориться что чарсет может быть UTF8. Мне он надо чтоб поддерживать кирилицу. Вроде в...
    от Alezis в разделе SQL

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения