Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];

Вниз

Как считать число типа 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
14-18558
Ashtray
2003-09-18 17:58
2003.10.06
СУБД Cache


1-18392
Windman
2003-09-22 13:48
2003.10.06
Работа с Excel через COM интерфейс


1-18431
alex25
2003-09-25 10:43
2003.10.06
Динамическое создание кнопок


1-18353
RedEagle
2003-09-23 09:38
2003.10.06
Разноцветные строки в ListBox


1-18332
TolikM
2003-09-23 10:04
2003.10.06
String в OleVariant





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский