![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с преобразованием типов данных [D7, WinXP]
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