Суббота, 23 Ноября 2024, 06:01

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг