Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.06;
Скачать: CL | DM;

Вниз

Как считать число типа Word или SmallInt из массива...   Найти похожие ветки 

 
Balkon   (2003-09-25 10:58) [0]

Привествую мастера! Как считать число типа Word или SmallInt из массива типа Byte. Смысл в том, что из порта заполняется массив побайтно, а разбирать его нужно по два байта (типом Word или SmallInt).

Делаю так:
...
var
P1 : Pointer;
P2 : PWord;
WordVar: Word;
...
P1 := @ByteArray[num];
P2 := P1;
WordVar := P2^;
...
Но не работает - компилятор игнорирует строку P2 := P1; и в итоге в P2 лежит что-то произвольное. Посоветуйте правильный подход.
Заранее благодарен.


 
Skier ©   (2003-09-25 11:01) [1]

Move(...) хорошая веСЧь


 
Verg ©   (2003-09-25 11:04) [2]

WordVar:=PWORD(@ByteArray[num])^;

Не проходит что ли?


> компилятор игнорирует строку P2 := P1;


Не, че-то не верится.


 
panov ©   (2003-09-25 11:04) [3]

p1: Pointer;
w: Word;
NumByte: Integer; //смещение
begin
p1 := @ByteArray[0];
NumByte := 10;
p1 := Pointer(Integer(p1)+(NumByte-1)*2);
move(p1^,w,2);


 
SergeyX   (2003-09-25 11:06) [4]

Всмысле игнорирует?
Конечно в вашем коде не хватает New(p2) )))).

А считать наверное можно так:
Move(Pointer(DWORD(@ByteArray)+Num)^,Pointer(Dword(p2)+1));
Move(Pointer(DWORD(@ByteArray)+Num+1)^,Pointer(Dword(p2)));


 
SergeyX   (2003-09-25 11:07) [5]

Т.е. так:
Move(Pointer(DWORD(@ByteArray)+Num)^,Pointer(Dword(p2)+1)^);
Move(Pointer(DWORD(@ByteArray)+Num+1)^,Pointer(Dword(p2))^);


 
Verg ©   (2003-09-25 11:21) [6]


> SergeyX (25.09.03 11:07) [5]
> Т.е. так:
> Move(Pointer(DWORD(@ByteArray)+Num)^,Pointer(Dword(p2)+1)^);
> Move(Pointer(DWORD(@ByteArray)+Num+1)^,Pointer(Dword(p2))^);


Ты это серъезно? :)


 
panov ©   (2003-09-25 11:24) [7]

>SergeyX (25.09.03 11:07) [5]

Ты бы попробовал у себя выполнить(да даже скомпилировать) для начала.


 
PVOzerski ©   (2003-09-25 11:31) [8]

ByteArray как описан?


 
Palladin ©   (2003-09-25 11:45) [9]

var
P1 : Pointer;
P2 : PWord absolute p1;


 
Balkov   (2003-09-25 12:37) [10]

Уважаемые!
Следующий вариант выдает WordVar = 513, хотя
хочется вообще говоря получить WordVar = 258. И это получается
если ...ByteArray[1] := 2; ByteArray[2] := 1;..., т.е. "присутствует обратный порядок байт". Как быть? (Прочие рекомендации давали совсем невразумительные результаты)

var
ByteArray: array[1..10] of Byte;
WordVar: Word;
begin
ByteArray[1] := 1;
ByteArray[2] := 2;
WordVar := PWord(@ByteArray[1])^;


 
panov ©   (2003-09-25 13:19) [11]

Так массив у тебя в неправильном порядке заполняется...

Если это необходимо, то переставляй байты.


 
Balkon   (2003-09-25 13:21) [12]

Точно таже история при считывании SmallInt. Возможен конечно такой вариант, как переприсвоение массива в обратном порядке попарно. :). Тогда считать будет возможно.

Если у кого нибудь есть "более изящные" варианты, может поделитесь.

В любом случае Всем спасибо!


 
ZrenBy ©   (2003-09-25 13:22) [13]

var B : array[1..10] of byte;
W : WORD;
i : byte;
begin
for i:=1 to 10 do B[i] := i;
W := PWord( Integer(@B[1]) + 0 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := PWord( Integer(@B[1]) + 2 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := PWord( Integer(@B[1]) + 4 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := PWord( Integer(@B[1]) + 6 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);
W := PWord( Integer(@B[1]) + 8 )^; Application.MessageBox(PChar(IntToStr(W)),"",0);

W := swap(PWord( Integer(@B[1]) + 0 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 2 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 4 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 6 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);
W := swap(PWord( Integer(@B[1]) + 8 )^); Application.MessageBox(PChar(IntToStr(W)),"",0);


 
Verg ©   (2003-09-25 15:01) [14]


> "присутствует обратный порядок байт". Как быть?


Господи...

WordVar := Swap(PWord(@ByteArray[num])^);


 
han_malign ©   (2003-09-25 15:20) [15]

>"присутствует обратный порядок байт"
- дык, родной, разберись сначала чем Big endian от Low endian отличается, а потом людям голову морочь... А порядок самый что ни на есть "прямой" - от младшего байта к старшему.


 
willys ©   (2003-09-25 19:07) [16]

а что, арифметикой уже никто не пользуется?! W := B1 + (B2 shl 8);



Страницы: 1 вся ветка

Текущий архив: 2003.10.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
1-18328
vixic
2003-09-23 12:46
2003.10.06
COM OLE Script


1-18370
TNT
2003-09-22 19:45
2003.10.06
Что такое точка входа в dll?


3-18223
snake1977
2003-09-17 11:14
2003.10.06
Фрмат даты+время


1-18294
Vt
2003-09-24 07:16
2003.10.06
Мастера почему не работает процедура Close. На onShow


6-18528
isya
2003-08-05 12:03
2003.10.06
Ferewall