PDA

Просмотр полной версии : Преобразование типов С\С++


Snake Plissken
25.01.2010, 10:32
Пагни, у меня вопрос. Как можно грамотно преобразовать size_t в TCHAR.

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

slesh
25.01.2010, 10:52
эм.. TCHAR это в зависимости от настроек алиас на wchar_t (2 байта) или char (1 байт)
а size_t - unsigned int (4 байта) Так что преобразовать полностью не получится. Места не хватит.

Snake Plissken
25.01.2010, 10:58
Я подразумеваю что у меня TCHAR'овая строка.

slesh
25.01.2010, 11:05
Ну тогда TCHAR* а не TCHAR
Тебе что именно нужно? перевести из числа в строку или просто засунуть в двоичном виде в буфер?

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

Если преобразовать в стркоу, то
sprintf(buf, "%u", i);

Snake Plissken
25.01.2010, 11:14
sprintf ругается

Error 1 error C2664: 'sprintf' : cannot convert parameter 1 from 'TCHAR *' to 'char *'

swprintf и прочее пробовал - компилер не ругается, а во время работы программа вылетает с немыслимыми ошибками и еретическими речами

Snake Plissken
25.01.2010, 12:54
Все, разобрался. С TCHAR * buf не работает, нужно размер указывать обязательно. Хуита

Gar|k
25.01.2010, 18:59
Snake Plissken мда... подобные ругательства лечатся явным определением типов...

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

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

AlexTheC0d3r
25.01.2010, 21:21
Snake Plissken мда... подобные ругательства лечатся явным определением типов...

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

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

программа написаная с использованием UNICODE, будет работать быстрее чем с ASCII

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

Ra$cal
25.01.2010, 21:51
дело в том, что процессор работает с UNICODE, и если программа написана в с использованием ascii, будет затрачено дополнительное время на преобразование
какой нах процессор с юникодом работает? это апи виндовые юникодные. и именно ось тратит время на преобразование аски в юникод.

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

AlexTheC0d3r
25.01.2010, 22:31
какой нах процессор с юникодом работает? это апи виндовые юникодные. и именно ось тратит время на преобразование аски в юникод.

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

Очепятка, извините

nerezus
25.01.2010, 22:42
а size_t - unsigned int (4 байта) Неверно

дело в том, что процессор работает с UNICODE *ROFL*

Насколько я понял size_t это алиас для unsigned int? Нет, это беззнаковая целая размерностью с указатель.

Gar|k
26.01.2010, 01:01
2 AlexTheC0d3r
бывают ситуации, когда ты используешь фрагмент чужого кода например для генерации md5 хешей, а код этот был написан на Си в стародавние времена под unix...

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

Snake Plissken
26.01.2010, 02:16
Snake Plissken мда... подобные ругательства лечатся явным определением типов...

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

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

Ты понимаешь вообще что ты написал в примере ерунду полную. Помдакай мне еще тут.

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

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

Gar|k
26.01.2010, 02:48
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

теперь твоему мозгу это понятно?

Snake Plissken
26.01.2010, 02:55
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

теперь твоему мозгу это понятно?


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

Между прочим от чего все это? От неуважения к собеседнику.

Ra$cal
26.01.2010, 07:00
Между прочим от чего все это? От неуважения к собеседнику.
Все это от плохо заданных вопросов. Что ты хочешь получить на выходе. Для чего будет использоваться TCHAR*? В строку можно копировать как двоичное значение(тем самым получая обычный массив аля short* или BYTE*), так и переводить число в строку. То ли у тебя вся программа на TCHAR и ты не можешь адекватно понять юзать ли char* для целей хранения байтового массива.

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

Snake Plissken
26.01.2010, 10:30
Я четвертым постом ответил что уже разрешил вопрос, понимаешь?

slesh
27.01.2010, 10:11
Ответ найдей. Хватит флудить! Тему закрываю!