Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Есть ли стандартная функция для получения нижнего слова?


Cosinus ©   (2004-12-21 15:12:00) 

То есть что то типа HiWord(Value:longword):word?


Cosinus   (2004-12-22 10:31:00) [1]


> begin...end ©   (21.12.04 19:18) [3]

Спасибо, но у меня так и было сделано. Меня просто интересовала стандартная.. Но все равно спасибо :))

> VMcL ©   (21.12.04 20:21) [5]

Естественно интересовало и "верхнее".

To All.
На самом деле я поторопился вчера вопрос задать. Вроде в справке рылся - и ничего не нашел, а сегодня с утра как на подбор :) The HIWORD macro retrieves the high-order word from the given 32-bit value.

WORD HIWORD(

   DWORD dwValue // value from which high-order word is retrieved
  );

The LOWORD macro retrieves the low-order word from the given 32-bit value.

WORD LOWORD(

   DWORD dwValue // value from which low-order word is retrieved
  );

HiLoWords
Unit: IdDNSResolver
Represents data with High and Low Word values.

HiLoWords = record
 HiWord: Word;
 LowWord: Word;
 end;


palva   (2004-12-22 10:07:00) [2]

А в Free Pascal функция Hi работает по-другому.

Hi returns the high byte or word from X, depending on the size of X. If the size of X is 4, then the high word is returned. If the size is 2 then the high byte is returned. Hi cannot be invoked on types of size 1, such as byte or char.

По-моему, это логичней.


begin...end   (2004-12-21 20:25:00) [3]

Так, а у меня в [3] лишнее: в HiWord3 вместо Result := (Value and $FFFF0000) shr 16можно просто Result := Value shr 16.


VMcL   (2004-12-21 20:21:00) [4]

>> Cosinus ©  (21.12.04 15:12)

Для нижнегослова функция не нужна.

var
 a: Word;
 b: LongWord;
//...
 a := Word(b);


VaDima   (2004-12-21 19:20:00) [5]

LoWord := PWORD(@DWordValue)^


begin...end   (2004-12-21 19:18:00) [6]

> Cosinus ©   (21.12.04 15:12)

Ну как, разобрался?

Если нет, то вот несколько примеров (получение старшего слова):

function HiWord1(Value: Longword): Word;
begin
 Result := LongRec(Value).Hi
end;

function HiWord2(Value: LongWord): Word;
var
 Val: array [0..1] of Word absolute Value;
begin
 Result := Val[1]
end;

function HiWord3(Value: LongWord): Word;
begin
 Result := (Value and $FFFF0000) shr 16
end;

function HiWord4(Value: LongWord): Word;
begin
 Result := PWord(Cardinal(@Value) + 2)^
end;

function HiWord5(Value: LongWord): Word;
begin
 CopyMemory(@Result, Pointer(Cardinal(@Value) + 2), 2)
end.


begin...end   (2004-12-21 16:42:00) [7]

> Cosinus ©   (21.12.04 15:12)

> Есть ли стандартная функция для получения нижнего слова?

Стандартной функции, предназначенной именно для этого, нет.

Тем не менее, есть вариантные записи ([1]), директива absolute, функция CopyMemory, тип Pointer и т.д.


Anatoly Podgoretsky   (2004-12-21 15:30:00) [8]

Может заднего?
LongRec


Наверх

Титульная страница Поиск, карта сайта Написать письмо