Как работи това?

9 отговора 435 прегледа
#1

Как работи това?

type sp = ^single;

var
AAA: integer;
AAAA: single;
ss: sp;
begin
aaa:=hextoint(s);
ss := @AAA;
AAAA := ss^;
result := aaaa;
end;

Като S ми е HEX Value (стринг) - например
'3F88F5C3'
Точно въпросът ми е как след предаването на указателя се формира каде точно да е плаващата запетая на Real числото?

Отговор
в отговор на r4ndOm #2

Re: Как работи това?

Честно казано не мога да се сетя за какво би ти трябвало такова нещо. Това, което правиш е да интерпретираш като Single 4 байта от паметта, където преди това си поставил Integer. Полученото число няма да има нищо общо с първоначалния integer, просто 32-та бита на integer-а ще се интерпретират по този начин и single числото ще има каквато стойност се получава при това интерпретиране.

Между другото по-просто може да стане с:
var
i : integer;
s : single;
begin
...
move(i, s, sizeof(s));
...

или
var
i : integer;
s : single;
begin
...
asm
mov eax, i
mov s, eax
end;
...


Отговор
в отговор на Formal #3

Re: Как работи това?

10x! За линка. Служи ми за конвертиране от HEX стойност в single

Отговор
в отговор на r4ndOm #4

Re: Как работи това?

var
AAA: integer;
AAAA: single absolute AAA;
begin
aaa:=hextoint(s);
result := aaaa;
end;


Отговор
в отговор на NDeu #5

Re: Как работи това?

Ето на това му викам аз елегантно решение! Защо не се сетих аз за него?!

Отговор
в отговор на NDeu #6

Re: Как работи това?

ебаси колко неща има да науча

Отговор
в отговор на r4ndOm #7

Re: Как работи това?

Да отбележа, че по-безопасно е:
var
R:record
Case Integer of
0: (I:integer);
1: (S:single);
end;
begin
R.I:=hextoint(s);
result := R.S;
end;

По-безопасно в смисъл, че едно преопределяне на типовете няма да ти чупи програмата, но пак не е сигурно че ще получиш това, което очакваш

Отговор
в отговор на NDeu #8

Re: Как работи това?

Не мога да разбера кога тоя кейз ще има стойност false?

Отговор
в отговор на r4ndOm #9

Re: Как работи това?

Този кейз не е като онзи
Обърни внимание, че той не е в изпълним блок, а в частта за декларациите. Т. е. той е само едно споразумение с компилатора, че когато ползваш означението R.I, стойността от тази област на паметта да се интерпретира като интеджър, а R.S - като сингъл. Кога кое означение да ползаш си е твое право и твоя отговорност

Същото в случая е и при използването на absolute, но в случая с Case (баси тафталогията) компилатора поема задължението да задели достатъчно място в паметта, за да се събере най-дългия вариант на записа, докато при absolute - това е изцяло на твой риск и отговорност.

За повече инфо - чети за вариантни записи в някоя стара книжка за Pascal

Отговор
в отговор на NDeu #10

Re: Как работи това?

Ахам, благодаря разясни ми се разликата между двете решения.

Отговор