Сейчас на форуме: zds (+5 невидимых)

 eXeL@B —› Программирование —› Float to text в инлайне
Посл.ответ Сообщение

Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 07 февраля 2014 23:49
· Личное сообщение · #1

Снова здравствуйте!
Требуется вывести float числа через SetWindowTextA, пытался найти какой-нибудь пример, но ничего путного, кроме использования некого FloatToString2 не нашел, но как я понял это какой-то макрос из MASM. Возможно у кого-нибудь есть наработки на данную тему? Буду премного благодарен



Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 08 февраля 2014 00:03 · Поправил: Vovan666
· Личное сообщение · #2

wsprintf, sprintf, StringCchPrintf %f ?




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 08 февраля 2014 02:05
· Личное сообщение · #3

TryAga1n пишет:
FloatToString2

Вообще то в Delphi есть FloatToStr но ни как FloatToString2

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 08 февраля 2014 08:53 · Поправил: OnLyOnE
· Личное сообщение · #4

TryAga1n пишет:
это какой-то макрос из MASM

Это не макрос..

TryAga1n пишет:
Возможно у кого-нибудь есть наработки на данную тему?


Все уже придумано до нас. В архиве реализации двух функций FloatToStr и FloatToStr2.
Обе функции из пакета MASM.
делают они одно и тоже - "Convert an 8-byte double-precision value to an ASCII string."


f6f9_08.02.2014_EXELAB.rU.tgz - fptoa.rar

-----
aLL rIGHTS rEVERSED!




Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 08 февраля 2014 13:32
· Личное сообщение · #5

OnLyOnE, спасибо. Как раз то, на что я натыкался




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 08 февраля 2014 16:28
· Личное сообщение · #6

*printf группа универсальных функций.



Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 08 февраля 2014 16:31
· Личное сообщение · #7

Dr0p пишет:
printf группа универсальных функций

Да, только проблема в том, что wsprintfA не работает c %f
Нашел такой вариант:
Code:
  1. finit
  2.     fld  FloatNumber
  3.     fstp DoubleNumber
  4.     fwait
  5.    
  6.     push DWORD PTR [DoubleNumber+4]
  7.     push DWORD PTR [DoubleNumber+0]
  8.     push OFFSET StrFormat
  9.     push OFFSET Buff
  10.     call msvcrt.sprintf

Но после работы в буфере почему-то получается 0.000000, хотя подаю число -93.88333




Ранг: 72.3 (постоянный), 133thx
Активность: 0.380
Статус: Участник

Создано: 08 февраля 2014 17:15
· Личное сообщение · #8

TryAga1n

Кртешные могут не работать, они трешевые. Юзайте нэйтивные --> Link <--



Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 февраля 2014 19:39 · Поправил: dosprog
· Личное сообщение · #9

TryAga1n,

Как-то так:
Code:
  1. .data 
  2. FloatNumber  dd  5.00000
  3. DoubleNumber dq  1.00000
  4. Buff         db 100h dup(0)
  5. strFormat    db '%f',0
  6. .code
  7.         finit
  8.         fld  FloatNumber   ;32-bit float load to stack
  9.         fstp DoubleNumber  ;64-bit double store from stack
  10.         fwait
  11.         ;
  12.         ;Дальше - обычное конверчение 64-bit double -> в строку Buff
  13.         ;
  14.         push dword ptr DoubleNumber+4  ;старшие 32 бита из 64-bit double
  15.         push dword ptr DoubleNumber    ;младшие 32 бита из 64-bit double
  16.         push OFFSET StrFormat     ;указатель на строку-спецификатор
  17.         push OFFSET Buff          ;указатель на строку-приёмник
  18.         call msvcrt_sprintf            ;msvcrt.dll - sprintf()
  19.         add esp,10h
  20.         
  21.         push 0
  22.         push 0
  23.         push offset  Buff
  24.         push 0
  25.         call MessageBoxA
то-есть, найденный вами вариант верный.

На MSVC:
Code:
  1. #include <stdio.h>
  2. void
  3. main(void)
  4. {
  5. float floatVar=5;
  6. double doubleVar=1;
  7. char s[0x100];
  8. _asm {
  9.  finit;
  10.  fld floatVar;
  11.  fstp doubleVar;
  12.  fwait;
  13. }
  14. sprintf(s,"%f",doubleVar); /*Правда, тут может работать и статическая RTL, а не MSVCRT.DLL */
  15. printf("%s",s);
  16. }


Всё нормально, печатает:
5.0000
в обоих случаях.



| Сообщение посчитали полезным: TryAga1n

Ранг: 262.5 (наставник), 337thx
Активность: 0.340.25
Статус: Участник

Создано: 10 февраля 2014 12:21
· Личное сообщение · #10

Еще раз хочу поблагодарить всех за участие. Это все моя тупость, я лоханулся на реверсе DWORD'ов.


 eXeL@B —› Программирование —› Float to text в инлайне
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати