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

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

Указатель на массив. [D7, XP]


Kolan ©   (2006-02-02 23:04:00) 

Здравствуйте,
 Простой вопрос:
var
 P: Pointer;
 Arr: array of Byte;
begin
 SetLEngth(Arr, 10);
 P := Arr;
end;


Впрос - как добраться до элементов массива имея P?


Pointer   (2006-02-04 01:01:00) [1]

procedure TForm1.Button1Click(Sender: TObject);
VAR P: Pointer;   Arr: array[0..10] of Byte;
I:word;
begin
 FOR I:=0 TO 10 DO Arr[i]:=i;
 P := @Arr[0];
 FOR I:=0 TO 10 DO
 BEGIN
   Caption:=Caption+' '+inttostr(PByte(P)^);
   INC(PByte(P));
 END;
end;


begin...end   (2006-02-03 08:14:00) [2]

PByte(PAnsiChar(Arr) + ElemIdx)^


Almaz   (2006-02-03 00:38:00) [3]


> Впрос - как добраться до элементов массива имея P?

Как альтернатива предложенному варианту, особенно, если не задумываться о размере элемента массива, можно сделать так:

type
 TDynByteArray = array of byte;
...
var
 Arr: TDynByteArray;
 P: Pointer;
begin
 SetLength(Arr, 10);
 P := Arr;
 ...
 TDynByteArray(P)[5] := Value;
  ...
end.


Удачи.


Eraser   (2006-02-02 23:36:00) [4]


> Kolan ©   (02.02.06 23:31) [5]


> nteger(P) преобразуем указательв число длятого чтобы...

к этому числу можно было прибавить смещение, по которому находится нужный элимент. Т.к. длина типа байт равна одному байту, то просто прибавляем индекс элимента к указателю на массив и всё.


Kolan   (2006-02-02 23:31:00) [5]

Loginov Dmitry ©   (02.02.06 23:14) [2]
Eraser ©   (02.02.06 23:17) [3]


val := Byte(Pointer(integer(P) + ElemIdx)^);

А обяснить можно? :)

Типа: integer(P)преобразуем указательв число длятого чтобы...

Благодарю за помошь....


Eraser   (2006-02-02 23:17:00) [6]

val := Byte(Pointer(integer(P) + ElemIdx)^);


Eraser   (2006-02-02 23:17:00) [7]


> Loginov Dmitry ©   (02.02.06 23:14) [2]

эх... зря исправлял :)


Loginov Dmitry   (2006-02-02 23:14:00) [8]

Поправочка :)

Byte(Pointer(Integer(P) + ElemIdx - 1)^) := Value;
(-1 - если первый индекс единица. Можно и без нее)


Loginov Dmitry   (2006-02-02 23:09:00) [9]

Byte(Pointer(P + ElemIdx - 1)^) := Value;


Наверх

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