Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 14:00 19.04.24 
Компютри и Интернет
   >> Delphi
Всички теми Следваща тема *Кратък преглед

Тема byte array -> record  
Авторlj (Нерегистриран)
Публикувано26.02.04 09:19



imam edin packed record s 2 integer poleta
i edin array of byte, chiito razmer e raven na razmera (v bytes) na recorda.

opitvam se da kopiram pametta ot tozi byte-array varhu pametta na recorda i posle da vidq stojnostite na poletata ot recorda, samo che javno nestho ne e taka kakto si go predstavqm.

kazete mi molq edin packed record (na compilatora mu e kazano alignment = 1) kak se predstavq v pametta ?

moga li da ochakvam, che prosto sa zadeleni posledovatelno neobhodimite bytes za vsqko pole, primerno

field1 : integer - t.e. 4 bytes
field2: cardinal - t.e. 4 bytes
field3 : byte - t.e. 1 byte
i t.n.
?

iskam izkustveno da napravq "typecast" na edna porediza ot bytove kum edin record, samo che zasega nqmam uspeh.

primerno imam gornia record ot 3 poleta i imam edin array of byte 11 bytes, kojto ima stonosti:
0,0,0,1,0,0,2,0,90
moga li da go kopiram taka varhu recorda , che sled tova da se poluchi
field1 (integer (4 bytes)) = (0,0,0,1) = 1 + 0*256 + 0*256^2 + 0*256^3 = 1;
field2 (cardinal (4 bytes)) = (0,0,2,0) = 0 + 2*256 + 0*256^2 + 0*256^3 = 512;
field3 (byte (1 byte)) = 90;
?
zasega za filed1 vmesto 1 se poluchava 256^3 , t.e. izliza , che 1 se e kopiralo v naj-starhia byte ot integera, samo che ne moga da razbera zashto



Тема Re: byte array -> recordнови [re: lj]  
Автор NikB (любопитен)
Публикувано26.02.04 09:44



Дано това ти помогни да разбереш защо



unit Unit1;

interface

type
tRec = record
a : integer;
b : integer;
c : byte;
end;
tArr = array[0..8] of byte;

{}function Glupost(var Arr: tArr): tRec;

implementation

{}function Glupost(var Arr: tArr): tRec;
var
x: tRec absolute Arr;
begin
move(x,Result,sizeOf(Result));
end;

end.

Редактирано от NikB на 26.02.04 09:45.



Тема Re: byte array -> recordнови [re: NikB]  
Авторlj (Нерегистриран)
Публикувано26.02.04 10:11



ami tova s absolut go probvah , no efecta e sashtia :(



Тема P.S:нови [re: lj]  
Авторlj (Нерегистриран)
Публикувано26.02.04 10:15



moje greshkata da e pri men - neznam.
ti tova probval li si go ?
ima li neshto po-specialno da se nastroi na compilatora osven record field alignment da e 1?



Тема Re: P.S:нови [re: lj]  
Автор NikB (любопитен)
Публикувано26.02.04 11:26



Проблемът е, че компилаторът ползва подредбата на Интелските процесори.
Няма опция на компилатора, но може да има функции за обръщане на integer.
Ако си напишеш собствена с shl и събиране, вместо стеленуване - ще е ефективна като на асемблер.
l=b0;
l:=(((((l shl 8)+b1) shl 8)+b2) shl 8)+b3;



Тема Re: byte array -> recordнови [re: lj]  
Автор SDR (TaskMaster)
Публикувано26.02.04 12:16



mi ako ne ti se zanimawa s variant parts in record:


type
TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
TFigure = record
case TShapeList of
Rectangle: (Height, Width: Real);

Triangle: (Side1, Side2, Angle: Real);
Circle: (Radius: Real);
Ellipse, Other: ();
end;


mojesh da polzwash malko groznata ot gledna tochka na kompiliran kod tehnika:


type
t1=record
t1f1:type1;
t1f2:type2;
end;
p1=^t1;
t2=record
t2f1:type3;
t2f2:type4;
end;
p2=^t1;
var
v1:T1;
ptr2:P2;
....
ptr2=@v1;
v1.t1f1:=....
ptr2^.t2f1:=....



------------------------------
I got a COMPILER, and I'm not afraid to use it!

Тема takaнови [re: SDR]  
Авторlj (Нерегистриран)
Публикувано26.02.04 13:39



sled parvia otgovor si napravih edna funckia za RevferseBytes i varshi rabota.
a vizdam che i posledvaloto predlojenie e sashtoto :)

edinstvenoto neudobstvo idva ot tova che tozi buffer of bytes shte se nalaga da se "parsva" kam razlichni record typove.
i shte trqbva da pravq reverse na za vsqko pole rachno.

ta se chudq neshto , ama shte go pusna kato otdelen vapros ("poletata v pascalskia record") , shtoto mi se struva che e interesno samo po sebe si.



Тема Re: takaнови [re: lj]  
Автор Hateras (чакащ)
Публикувано28.02.04 16:33



дори и да разбереш типовете в записа, пак ще трябва да реверсваш битовете

Am I evil?
Yes I am.


Тема Re: takaнови [re: Hateras]  
Автор SDR (TaskMaster)
Публикувано29.02.04 13:05



BSWAP—Byte Swap
Description
Reverses the byte order of a 32-bit (destination) register: bits 0 through 7 are swapped with bits
24 through 31, and bits 8 through 15 are swapped with bits 16 through 23. This instruction is
provided for converting little-endian values to big-endian format and vice versa.
To swap bytes in a word value (16-bit register), use the XCHG instruction. When the BSWAP
instruction references a 16-bit register, the result is undefined.
IA-32 Architecture Compatibility
The BSWAP instruction is not supported on IA-32 processors earlier than the Intel486
processor family. For compatibility with this instruction, include functionally equivalent
code for execution on Intel processors earlier than the Intel486 processor family.


i az qsnota:


function bswapint (i:integer):integer;register;assembler;
asm
bswap eax
end;


------------------------------
I got a COMPILER, and I'm not afraid to use it!

Тема Tova "bswap" e nai efektivnoнови [re: SDR]  
Автор NikB (любопитен)
Публикувано29.02.04 16:57



Tova "bswap" e nai efektivno




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.