Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с преобразованием типов данных [D7, WinXP]


Страницы:   1 2

vodvorezlaya ©   (2006-09-01 16:32:00) 

ДОБРОГО ВРЕМЕНИ СУТОК.

Есть данные 8-байт. Все 4 переменные типа word содержат в себе одно значение с плавающей точкой; (4byte*2=8byte)
Я знаю что формат этих данных float или real.

Как присвоить их одной переменной это понятно
допустим b4 самое старшее слово(2 байта).

b4*$ffffff+b3*$ffff+b2*$ff+b1=8 байт данных в формате LongWord

Ув. мастера вопрос:

Как перевести эти 8 бит данных в формат float или real но с плавающей запятой?
Есть догадки что через указатели.

Заранее спасибо.


vodvorezlaya   (2006-09-04 08:51:00) [21]


> 1:
> var
>    pw: array[0..3]of word;

А где младший и где старший розряды?


vodvorezlaya   (2006-09-04 08:20:00) [22]


> 1:
> var
>    pw: array[0..3]of word;
>    _pf_pw: array[0..1]of single absolute pw;
>    _pd_pw: array[0..0]of double absolute pw;
> 2:
> type
>   TExplicitCastFloat = packed record
>   case byte of
>      0: (pw: array[0..3]of word);
>      1: (pf: array[0..1]of single);
>      2: (pd: array[0..0]of double);
>   end;
> 3:
>    pf[0]:= single((@pw[0])^);
> 4:
>    move(pw[0], pf[0], sizeof(pf[0]));

Я понял, ты шаришь. А можна с небольшим комментарием.
Спасибо.


vodvorezlaya   (2006-09-04 08:19:00) [23]


> Хрень какая-то ...
>
> Я нишута не понял.
>
> приведи реальное содержимое того что имеется и того что
> должно получиться в результате

Народ. Вопрос не в том немного.

В шестнадцатеричных кодах нет знака запятой, она содержится в первых розрядах типа данных Real. Тоесть если присвоить переменной типа Real переменную LongWord то получится тоже значение, но без знаков после запятой, а они там есть. Оно попросту не воспримет тип LongWord как имеющий знаки после запятой.
Т.е. нужно чтоб оно поняло что этот тип нужно воспринимать как Float.


DevilDevil   (2006-09-01 17:42:00) [24]

Поддерживаю Сергей М. ©   (01.09.06 16:48) [4]

В Delphi нет типа float, есть single (4 байта). Типы real и double эквивалентны. Занимают 8 байт.

Если тебе надо "переконвертировать" double в single, то делает ся Очень Просто:

var
d : double;
s : single;
begin
 d := 18.144; // 8 байт
 s := d; // 18.144;   4 байта
 ...
end;


Что касается массива (например ARR = array[0..3] of word), то преобразовать в double можно так:

d := double(ARR); // лично я сталкивался с ошибками
или
d := pdouble(@ARR[0])^;

НО самый крутой способ, как предложил han_malign © :

var
 ARR = array[0..3] of word;
 d: double absolute ARR;


В таком случае ARRи dбудут указывать на одну и туже область памяти. Можешь обращаться к массиву, а можешь сразу к double переменной


Сергей М.   (2006-09-01 16:48:00) [25]


> vodvorezlaya   (01.09.06 16:32)


Хрень какая-то ...

Я нишута не понял.

приведи реальное содержимое того что имеется и того что должно получиться в результате


han_malign   (2006-09-01 16:44:00) [26]

1:
var
   pw: array[0..3]of word;
   _pf_pw: array[0..1]of single absolute pw;
   _pd_pw: array[0..0]of double absolute pw;
2:
type
  TExplicitCastFloat = packed record
  case byte of
     0: (pw: array[0..3]of word);
     1: (pf: array[0..1]of single);
     2: (pd: array[0..0]of double);
  end;
3:
   pf[0]:= single((@pw[0])^);
4:
   move(pw[0], pf[0], sizeof(pf[0]));


Dmitrij_K   (2006-09-01 16:42:00) [27]

в delfi приведение типов делается так
:= ВоЧтоПривести(Переменная);

Самый маленький тип с плавточкой Single занимает 4 байта т.е. в твои 8 байт можно запихнуть 2 переменные Single.


Elen   (2006-09-01 16:41:00) [28]


> vodvorezlaya

Воспользуйся типом Extended


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо