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

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

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

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

    1. В этом завале абсолютно не очевидно.
    2. А такой вообще есть?
    3. Что он делает?
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

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

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #22
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,057
    Вес репутации
    20

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

    Да что ж ты, как ребёнок малый? Неужели обязательно нужно тыкать и объяснять всё? Открой гугл и узнай, что делает конструктор.

    Я понимаю, когда школьники или студентики начальных курсов не могут ни в чём разобраться сами. Они не привыкли ещё самостоятельно работать. Но ты же дядька уже...
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

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

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

    Цитата Сообщение от Absurd Посмотреть сообщение
    Поэтому макросам дают такие имена чтобы не напарываться
    . В большом проекте с обилием чисел. Костыль - не заплатка, тем более если он ещё и из спичек.
    Цитата Сообщение от Absurd Посмотреть сообщение
    Код cpp:
    1. void f1()
    2. {
    3.  const float x=20.3;
    4. }
    5. void f2()
    6. {
    7.  const float x=30.64;
    8. }
    Зачем тут вообще ставить const?
    А зачем вообще нужны константы?
    Цитата Сообщение от Absurd Посмотреть сообщение
    Стек вообще RW память, const в нем нельзя реализовать физически.
    Энто кто тебе сказал?
    Цитата Сообщение от Absurd Посмотреть сообщение
    Код 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
    Потому что константа неявно приведена к переменной путём выхода за границу массива. Можно и чуть явней
    Код cpp:
    1. uniont Q {
    2.   float nefarious[1];
    3.   const float x = 20.3;
    4. };
    5. int main()
    6. {
    7.  Q.nefarious[0]=666;
    8.  std::cout<<Q.x;
    9.  return 0;
    10. }
    и даже выравнивание значения иметь не будет. const защищает данное от изменение только при доступе по его имени, а если плясать с бубном на тему "А давайте сверху кинем переменную", то ни кто великому чукотскому писателю не виноват, что он так странно пишет. Константный указатель тоже защищает лишь от изменения с использованием самого константного указателя, но не через другой указатель и не так:
    Код cpp:
    1. int x=6;
    2. const int *p=&x;
    3. x=23;
    . И от того, что данное объявлено статически, или глобально, или вообще лежит в куче ничего не меняется.
    Последний раз редактировалось Сионист; 15.12.2015 в 13:43.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

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

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

    В большом проекте с обилием чисел. Костыль - не заплатка, тем более если он ещё и из спичек
    Ну ИМХО Unreal это достаточно большой проект при всем том.

    Зачем тут вообще ставить const?
    А зачем вообще нужны константы?
    Тут мы имеем дело с языком С++, то есть с тридцатилетней эволюцией комплексов мистера Бьорна Строуструпа, устаревших трендов, ошибочных концепций, тупиковых идей, несбывшихся надежд, шумихи начала 90-х, моды на ООП, анти-сиплюсплюсной реакции после появления Джавы, неожиданно удачного применения фичей С++ для решения проблем для которых они не предназначались, моды на функциональное программирование, притока программистов из академической среды хорошо знающих теорию групп, теорию категорий, дискретную математику и математическую логику, Лисп, Схему, Хаскелль и Coq итд итп.

    Короче, const не служит для определения констант. Такие дела. Для чего он служит - это отдельный разговор. Некоторые думают что ни для чего. Я менее резок и считаю что при помощи него можно защищать инварианты класса. Если я возвращаю ссылку на std::string которая является полем моего класса я могу одеть на нее const чтобы этот стринг никто не изменил случайно по причине непонимания интерфейса класса, либо по недосмотру. Но целенаправленно либо из-за рантаймовой ошибки - изменить сможет запросто.

    Стек вообще RW память, const в нем нельзя реализовать физически.
    Энто кто тебе сказал?
    Ну я могу конечно поставить при помощи VirtualProtect флаг Read-Only на вершину стека. Только программа при этом получит SEH исключение при первой же попытке изменить какую-то локальную переменную и перестанет работать.

    const защищает данное от изменение только при доступе по его имени
    Квалификатор const можно снять при помощи const_cast или C-style cast. Поскольку на практике объект всегда находится либо в хипе либо в стеке которые, в свою очередь, всегда RW и до недавшего времени даже были RWX, это всегда будет работать.
    Последний раз редактировалось Absurd; 16.12.2015 в 04:13.
    2B OR NOT(2B) = FF

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

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

    Этот "завал" был предложен на stackoverflow и был немедленно принят в качестве ответа. Но у Remy Lebeau нашлось куча нареканий к качеству кода и мне пришлось их фиксить несколько раз. Тебе я дал окончательный, вылизанный, вариант.
    2B OR NOT(2B) = FF

  7. #26
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,057
    Вес репутации
    20

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

    Цитата Сообщение от Сионист
    const защищает данное от изменение только при доступе по его имени
    Цитата Сообщение от Absurd
    Квалификатор const можно снять при помощи const_cast или C-style cast. Поскольку на практике объект всегда находится либо в хипе либо в стеке которые, в свою очередь, всегда RW и до недавшего времени даже были RWX, это всегда будет работать.
    Господа, вы оба не правы. Квалификатор const не только защищает данные от изменения при доступе по имени. И снимать константность с заведомо константного объекта с помощью const_cast является в корне неправильным подходом.

    Дело в том, что объявляя данные const мы не только запрещаем их изменение, но так же сообщаем компилятору, что эти данные не будут меняться во время выполнения программы/участка кода, таким образом разрешая ему производить оптимизацию. Именно поэтому в стандарте написано, что снятие константности с заведомо константных данных и их последующая модификация ведёт к undefined behavior.
    Код cpp:
    1. #include <iostream>
    2.  
    3. const int n = 10;
    4.  
    5. int main()
    6. {
    7.    std::cout << n << std::endl;
    8.    const_cast<int&>(n) = 5;
    9.    std::cout << n << std::endl;
    10.  
    11.    return 0;
    12. }
    Скомпилируйте этот код и запустите в студии. Программист, который такое написал, ожидает вывод 10 и 5, однако, на самом деле, в качестве результата вы увидите две десятки. Компилятор прооптимизировал оба вызова std::cout и подставил везде вместо самого n его значение. А то, что n поменяли - это уже проблема глупого программиста, который не прочёл стандарт.

    Если же скомпилировать и запустить это на MinGW, то вообще получите краш приложения.

    Одним словом - undefined behavior.

    А вот этот код будет работать адекватно на любом компиляторе:
    Код cpp:
    1. #include <iostream>
    2.  
    3. int n = 10;
    4.  
    5. void change_param(const int& param, int value)
    6. {
    7.    const_cast<int&>(param) = value;
    8. }
    9.  
    10. int main()
    11. {
    12.    std::cout << n << std::endl;
    13.    change_param(n, 5);
    14.    std::cout << n << std::endl;
    15.  
    16.    return 0;  
    17. }
    И всё потому,что мы снимаем константность, которая была наложена на объект за счёт передачи в функцию. Изначально же объект обладал не константной природой.
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

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

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

    Скомпилируйте этот код и запустите в студии. Программист, который такое написал, ожидает вывод 10 и 5, однако, на самом деле, в качестве результата вы увидите две десятки. Компилятор прооптимизировал оба вызова std::cout и подставил везде вместо самого n его значение
    Ну да, компилятор оптимизирует такие вещи. Но он и не-const переменную может заинлайнить если она не extern, у нее никто не берет адрес и не ставит в левую часть оператора присваивания. Кроме того, константы примитивных типов VC++ линкер помещает в секцию .CONST, а gcc сегмента .CONST не имеет и поэтому помещает разные статические стринги в сегмент .TEXT, который тоже RO. Только это не отменяет того что целочисленные константы определяются через enum, а плавающие - через constexpr. А const это никому не нужное унылое говно.
    2B OR NOT(2B) = FF

  9. #28
    Moderator Куратор
    system architect
    Romeo is on a distinguished road Аватар для Romeo
    Регистрация
    02.03.2004
    Адрес
    Крым, Севастополь
    Возраст
    36
    Сообщений
    3,057
    Вес репутации
    20

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

    Ну пока не было constrexpr, это была не унылое говно, а единственное правильное решение для плавающих Собственно, о последнем я и не спорю. Я просто сагрился на снятие константности через const_cast или С-style cast
    Entites should not be multiplied beyond necessity @ William Occam
    ---
    Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
    ---
    Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

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

    По умолчанию

    Господа, вы оба не правы. Квалификатор const не только защищает данные от изменения при доступе по имени.
    А ничего, что значение русского предложения определяется порядком слов? Не "только защищает", а
    защищает только
    .

    Ну я могу конечно поставить при помощи VirtualProtect флаг Read-Only на вершину стека. Только программа при этом получит SEH исключение при первой же попытке изменить какую-то локальную переменную и перестанет работать.
    А каким боком флаг защиты памяти к контролю доступа на этапе компиляции?

    Тут мы имеем дело с языком С++, то есть с тридцатилетней эволюцией комплексов мистера Бьорна Строуструпа, устаревших трендов, ошибочных концепций, тупиковых идей, несбывшихся надежд, шумихи начала 90-х, моды на ООП, анти-сиплюсплюсной реакции после появления Джавы, неожиданно удачного применения фичей С++ для решения проблем для которых они не предназначались, моды на функциональное программирование, притока программистов из академической среды хорошо знающих теорию групп, теорию категорий, дискретную математику и математическую логику, Лисп, Схему, Хаскелль и Coq итд итп.
    Бред, кобыла отдыхает. Именованные константы были ещё в паскале.

    Короче, const не служит для определения констант. Такие дела. Для чего он служит - это отдельный разговор. Некоторые думают что ни для чего. Я менее резок и считаю что при помощи него можно защищать инварианты класса. Если я возвращаю ссылку на std::string которая является полем моего класса я могу одеть на нее const чтобы этот стринг никто не изменил случайно по причине непонимания интерфейса класса, либо по недосмотру. Но целенаправленно либо из-за рантаймовой ошибки - изменить сможет запросто.
    Так он и предназначен для защиты от случайного изменения, это вам не паскаль, где константность даже типизированных данных абсолютна, а значения констант всегда подставляются на этапе компиляции, из-за чего есть даже мода называть константами литералы, причём, литералы называются явными константами, а константы - именованными константами. Но если константность не отменять, то она сохраняется. Логично однако.
    Последний раз редактировалось Romeo; 17.12.2015 в 09:19.
    Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.

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

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

    А каким боком флаг защиты памяти к контролю доступа на этапе компиляции?
    Изначальная реплика звучала так: "Стек вообще RW память, const в нем нельзя реализовать физически."

    Обычно когда программисты говорят "физически" они имеют в виду в виду уровень железа, т.е. аппаратную поддержку. Аппаратно памать распределяется страницами по 4К и флаг можно поставить только на целую страницу целиком.
    2B OR NOT(2B) = FF

+ Ответить в теме
Страница 3 из 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

Ваши права

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