Преобразование типов С\С++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Snake Plissken, 25 Jan 2010.

Thread Status:
Not open for further replies.
  1. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Пагни, у меня вопрос. Как можно грамотно преобразовать size_t в TCHAR.

    Насколько я понял size_t это алиас для unsigned int?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    эм.. TCHAR это в зависимости от настроек алиас на wchar_t (2 байта) или char (1 байт)
    а size_t - unsigned int (4 байта) Так что преобразовать полностью не получится. Места не хватит.
     
  3. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Я подразумеваю что у меня TCHAR'овая строка.
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну тогда TCHAR* а не TCHAR
    Тебе что именно нужно? перевести из числа в строку или просто засунуть в двоичном виде в буфер?

    Если просто засунуть в буфер, то
    TCHAR * buf; или TCHAR buf[хзхз];
    int i;
    *(int*)buf = i;

    Если преобразовать в стркоу, то
    sprintf(buf, "%u", i);
     
    1 person likes this.
  5. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    sprintf ругается

    Code:
     Error	1  error C2664: 'sprintf' : cannot convert parameter 1 from 'TCHAR *' to 'char *'	
    swprintf и прочее пробовал - компилер не ругается, а во время работы программа вылетает с немыслимыми ошибками и еретическими речами
     
  6. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Все, разобрался. С TCHAR * buf не работает, нужно размер указывать обязательно. Хуита
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Snake Plissken мда... подобные ругательства лечатся явным определением типов...

    char buf;
    sprintf((TCHAR *)buf,...,...);

    НО TCHAR это спецовый макрос (как уже сказал slesh), который в зависимости от настроек проекта ANSI или UNICODE создает определенные строки char или wchar_t
    поэтому или пиши все в UNICODE или поставь в настройках проекта ANSI.
     
    _________________________
  8. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    программа написаная с использованием UNICODE, будет работать быстрее чем с ASCII

    дело в том, что процессор работает с UNICODE, и если программа написана в с использованием ascii, будет затрачено дополнительное время на преобразование
     
  9. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    какой нах процессор с юникодом работает? это апи виндовые юникодные. и именно ось тратит время на преобразование аски в юникод.

    ps: последнее время столько лулзов даж баш не доставлял, сколько форум ачата.
     
  10. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    Очепятка, извините
     
  11. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Неверно

    *ROFL*

    Нет, это беззнаковая целая размерностью с указатель.
     
  12. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 AlexTheC0d3r
    бывают ситуации, когда ты используешь фрагмент чужого кода например для генерации md5 хешей, а код этот был написан на Си в стародавние времена под unix...

    Я практически не программировал под unix, но на своей памяти я не видел исходник си программы под unix c использованием unicode -> могу сделать вывод, что разрабатывая код под unicode ты лишаешься кроссплатформенности (ну это может я загнул)
     
    _________________________
  13. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Ты понимаешь вообще что ты написал в примере ерунду полную. Помдакай мне еще тут.

    А про кроссплатформенность - так это вообще отдельная тема, давайте здесь не будем ее затрагивать.

    Слешу спасибо. А ололокающие товарищи идите на свой башорг а не срите в теме.
     
  14. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Snake Plissken сначала попробуй понять, что я написал а патом обсирай.

    В WinAPI встречается куча преобразований т.к. например HANDLE это тот же DWORD тот же unsigned long, но компилятор ругается на передаваемые параметры. Примеры из жизни

    HFONT font=(HFONT)GetStockObject( ANSI_VAR_FONT );

    TCHAR buf[1024];
    SendMessage(hwnd,WM_SETTEXT,NULL,(LPARAM)buf);

    ----
    Если в твоем коде изначально используются куча переменных типа char и компилятор выдает кучу ошибок типа "cannot convert parameter from 'char *' to 'wchar_t *'" при компиляции поставь в настройках проекта - не использовать UNICODE кодировку.
    ----
    TCHAR это макрос придуманный мелкософтом. что-то типа:

    #ifdef _UNICODE
    typedef wchar_t TCHAR;
    #else
    typedef char TCHAR;
    #endif

    - что означает что в зависимости от настроек проекта TCHAR будет или char или wchar_t другими словами или ANSI либо UNICODE

    теперь твоему мозгу это понятно?
     
    _________________________
  15. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0

    Все что ты описал ниже своего примера из жизни я знаю и тебя об этом не спрашивал. А вот тот кусок кода что ты мне с самого начала скинул, там где sprintf((TCHAR) buf ... ты сам для начала скомпилируй и запусти. И посмотри что тебе выдаст студийный дебаггер.

    Между прочим от чего все это? От неуважения к собеседнику.
     
    #15 Snake Plissken, 26 Jan 2010
    Last edited: 26 Jan 2010
  16. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Все это от плохо заданных вопросов. Что ты хочешь получить на выходе. Для чего будет использоваться TCHAR*? В строку можно копировать как двоичное значение(тем самым получая обычный массив аля short* или BYTE*), так и переводить число в строку. То ли у тебя вся программа на TCHAR и ты не можешь адекватно понять юзать ли char* для целей хранения байтового массива.

    Чем гавенее задается вопрос - тем больше флейма. Самому не понятно? Видишь срач начинающийся - значит косяк с вопросом. Конкретизируй, что тебе требуется.
     
  17. Snake Plissken

    Snake Plissken New Member

    Joined:
    7 Jul 2008
    Messages:
    21
    Likes Received:
    0
    Reputations:
    0
    Я четвертым постом ответил что уже разрешил вопрос, понимаешь?
     
  18. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ответ найдей. Хватит флудить! Тему закрываю!
     
Thread Status:
Not open for further replies.