как скопировать массив char в окно без искажений? (русский шрифт)

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 8 фев 2012.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья! То есть окно "оконное", не консоль. Я делаю это посимвольно, перебирая строку и на каждом символе посылаю окну сообщение:

    Код (Text):
    1.   char* temp= "строка";                                    
    2.   printf ("проверим %s\n", temp);
    3.   for (int j= 0; j< (int)strlen (temp); j++) {                                    
    4.    SendMessage ((HWND)HWND_okna, WM_CHAR, temp [j], 1);  
    5.   }
    в результате в окне печатается сушь:
    ясятяряоякяа (это типа "строка", перед каждой буквой вставилось "я")

    А если английский шрифт, то без проблем; как быть? Спасибо, кто откликнется
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    unsigned char* temp
     
  3. sender0

    sender0 New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2011
    Сообщения:
    25
  4. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    leo
    Вы верно шутите.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    amvoz
    Оу, квадратичная сложность вывода строки от ее длины. Шикарно.
     
  6. deLight

    deLight New Member

    Публикаций:
    0
    Регистрация:
    26 май 2008
    Сообщения:
    879
    _DEN_
    ммм.. а с буйа она тут квадратичная?
    upd: в тему реплейснулось, оставим gui
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    deLight

    С того, что для вывода строки из N символов будет обработано N^2 символов. strlen(temp) имеющая сложность o(N) будет выполнена N раз, то есть общая сложность - o(N^2).
     
  8. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    amvoz, что это за окно?
    М.б. оно ждет кодов в юникод?
     
  9. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    с предельно большой вероятностью современный оптимизирующий компилятор без проблем "соптимизирует" этот код в один вызов...

    совершенно очевидно, что проблема с кодировкой... попробуй задать строку в UTF-16 (WCHAR и L"строка") и передать ее... или узнавай текущую локаль того процесса и конвертируй анси...
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Rel
    Ну, если только написать свою инлайн strlen в том же модуле :) А насчет внешних не-инлайн функций нормальный компилер не должен делать никаких предположений о наличии\отсутствии у них сайд-эффектов
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Rel
    С предельно большой вероятностью не "соптимизирует". Хотя бы потому что строка - не константна, и ей ничего не мешает на каждой итерации иметь разную длину.
     
  12. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    _DEN_ хорош слова говорить разные. Если длина строки 5 символов, то цикл выполнится 5 раз, а не 6 и не 7 и не 25, что и нужно. Всё!

    ++++++++++++++++++++++++++++++++++++++++

    unsigned char* temp помогло, leo спасибо
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    amvoz
    Дело не в правильности\корректности, а в неоптимальности вызова strlen на каждой итерации - лучше и проще заменить условие просто на temp[j] или temp[j] != 0, если так понятнее ;)

    _DEN_
    Как раз то, что строка не изменяется компилер может предположить, т.к. в strlen она передается как const и в теле цикла не изменяется. Но кроме декларации функции strlen, компилер ничего о ней знать не должен и соотв-но не может предполагать, что она возвращает всегда одно значение и не производит каких-либо "глобальных" побочных действий
     
  14. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    В некоторых языках для подобных оптимизаций есть понятие детерминированности функций. В С/С++ такого понятия в явном виде конечно нет, но умный компилятор теоретически может самостоятельно выявить детерминированность кода (если видно, что выходной результат зависит только от аргументов и больше ни от каких внутренних/посторонних значений), тем более, если функцию он будет вставлять инлайн (а strlen вполне подходящий экземпляр для инлайна), и в совокупности c const char const *ptr вполне может принять решение об однократном применении. Еще возможен вариант - если подобные подсказки о детерминированности библиотечных функций имеются в компиляторе в совокупности с библиотеками.
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Dmitry_Milk
    Ага, только оптимизированный вариант strlen в msvcr весит сотню с лишним байт - вот и думай, что лучше: простецкий неоптимизированный инлайн, или навороченный не-инлайн, или навороченный инлайн с раздуванием кода на 100 байт на каждый вызов???
     
  16. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    leo, ну еще остается вариант с подсказками.
     
  17. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    temp[j] изящнее, конечно, теперь всегда так буду делать; просто у меня глаз замылился на сложных вещах а простые не замечаю.
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    amvoz
    Цикл действительно выполнится 5 раз. И на каждый раз будет вычислена длина строки. Чтобы вычислить длину строки, надо найти 0 в ее конце, то есть перебрать еще 5 байт. И того - пять раз перебрать 5 байт. Пять-ю-пять = двадцать пять. Я уже хз как более примитивно объяснить :)

    leo
    Ага, только не забывай про const_cast и c/function-style cast. Т.к. речь, похоже, идет о plain C, и strlen - функция plain C, то c-style cast - вполне себе нормальная операция, в отличие от спорного const_cast в C++, дающего кое-где UB. Кроме того, это мы знаем, что strlen возвращает именно длину строки. А компилятор этого не знает. Для компилятора она ничем не отличается от функции, возвращающей текущее время.
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    leo
    Это такой лол, что даже лол. Ты программируешь "Электронику ИМ-02" под игру "Ну, погоди!" ?
     
  20. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну и я тоже не знаю, Может, правильнее было сказать, что strlen () вызовется 5 раз? Это явный минус, несомненно. И в качестве альтернативы предложить temp [j]

    Я бы так сказал.