Float в LPCTSTR и обратно.
|
|
Deeem_ER | Дата: Вторник, 19 Февраля 2013, 22:52 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Здравствуйте, пользователи gcup! У меня, как видно из названия темы, появилась проблема с конвертацией числа с плавающей точкой в массив символов LPCTSTR[32] и обратно.
Думаю, что на этом вопрос можно и закончить, но я все-таки расскажу побольше: В данный момент я работаю над моим относительно большим проектом, который мне хочется называть "движком". Если хотите, то посмотрите вот это видео.
Как видно из видео, я попробовал сделать редактирование цветов компонентов материала - это частично получилось. Я это сделал вот так: Код //Буфер символов LPCTSTR textBuffer[32];
//Установка текущего значения компоненты в строку редактора текста wsprintf ((LPWSTR)textBuffer, L"%d", (int)material->Diffuse.r); SendMessage(EOMEditDiffuse1, WM_SETTEXT, NULL, (LPARAM)textBuffer);
//Установка нового значения компоненты из редактора текста GetDlgItemText(OSWindow, ID_EOMEDIT1, (LPWSTR)textBuffer, sizeof(textBuffer)); material->Diffuse.r = (float)atof((const char*)textBuffer);
Но это неправильно. При таком раскладе любое введенное значение обрезается до первого числа (ввел 294 - получил 2). Ну а о числах с плавающей точкой остается только мечтать. По хорошему выводимые и вводимые числа должны лежать в диапазоне от 0 до 1.
P.s. Для меня с самых первых дней изучения C++ сложнейшей и неприятнейшей вещью была работа со строками и символами.
Заранее спасибо за помощь ;3
Сообщение отредактировал Deeem_ER - Среда, 20 Февраля 2013, 21:00 |
|
| |
Demerion | Дата: Вторник, 19 Февраля 2013, 23:27 | Сообщение # 2 |
был не раз
Сейчас нет на сайте
| Когда-то столкнулся с такой проблемой и недолго думая написал код (конечно он не самый лучший и быстрый, но использовать можно): Код float __to_float(char* text) { char temp[25]; int ppos=-1; int now=0; int len=strlen(text);
for (int i=0;i<len;++i) { if (text[i]=='.') ppos=i; else { temp[now]=text[i]; ++now; } }
float res;
res=(float)atoi(temp);
if (ppos==-1) return res;
int count=len-ppos-1;
while (count>0) { res/=10; --count; }
return res; }
Сообщение отредактировал Demerion - Вторник, 19 Февраля 2013, 23:31 |
|
| |
Farcuat | Дата: Среда, 20 Февраля 2013, 00:31 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Попробуй в предпоследней строчке sizeof(textBuffer) заменить на 32.
|
|
| |
Нохчи | Дата: Среда, 20 Февраля 2013, 09:19 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Deeem_ER, 1) textBuffer - это у тебя массив указателей, LP - long pointer. 2) не нужно использовать TCHAR, ты все равно приводишь к юникоду. 3) для float используется swprintf 4) для юникод используется wtof Код #define SIZE 32 WCHAR textBuffer[SIZE]; swprintf ((LPWSTR)textBuffer, SIZE, L"%f", (float)material->Diffuse.r); GetDlgItemText(OSWindow, ID_EOMEDIT1, (LPWSTR)textBuffer, sizeof(WCHAR)*SIZE); material->Diffuse.r = (float)wtof((LPWSTR)textBuffer);
Многие вопросы по Windows отпадут, если посмотреть тут
Сообщение отредактировал Нохчи - Среда, 20 Февраля 2013, 09:21 |
|
| |
Deeem_ER | Дата: Среда, 20 Февраля 2013, 15:01 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Огромное спасибо всем, теперь все работает правильно >;3
|
|
| |