Главная страница
    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.008 c
3-18243
SerKom
2003-09-16 14:00
2003.10.06
Почему не проходят агрегируемые функции в запросе TADOQuery


14-18587
DeMoN-777
2003-09-13 19:56
2003.10.06
Почему не ставиться русская винда


14-18632
Nick-From
2003-09-17 11:52
2003.10.06
Нужно ли учить С ?


6-18522
Lizard
2003-08-07 09:57
2003.10.06
Как подключить диски удаленного компа ?


1-18450
mOOx_
2003-09-19 12:31
2003.10.06
OnChange:=Change;





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский