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

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

ПРоблемы с указателями [D7]


FZT ©   (2011-09-20 04:44:00) 

Господа, что я упускаю из вида, пытаясь так обратиться к указателю?
 TData = packed record
 ...
 end;
 
 PtrTTmpBuf = ^TTmpBuf;
 TTmpBuf = packed array[0..Max-1] of TData;
 
 Var
 ptrBuf : PtrTTmpBuf;
 lptr: Pointer;
 
 Begin
 lptr = ptrBuf;
 FillChar(ptrBuf^[0],100500,0);
 FillChar(lptr^[0],100500,0); //[Error] ххх.pas(): Array type required  
 end;


Ega23   (2011-09-20 10:35:00) [1]


procedure TForm19.Button2Click(Sender: TObject);
type
 PMyType = ^TMyType;
 TMyType = array[0..9] of Integer;
var
 a: TMyType;
 i: Integer;
 p: PMyType;
begin
 for i := 0 to 9 do
   a[i] := i + 1;
 p := @a;

 for i := 0 to 9 do
   Memo1.Lines.Add(IntToStr(p^[i]));
 Memo1.Lines.Add('');

 FillChar(p^, SizeOf(TMyType), $FF);

 for i := 0 to 9 do
   Memo1.Lines.Add(IntToStr(p^[i]));
end;


Ega23   (2011-09-20 08:39:00) [2]

FillChar(ptrBuf^[0],100500,0);
FillChar(lptr^,100500,0);

вроде так


Servy   (2011-09-20 05:33:00) [3]


> ptrBuf^[0] - указатель на младьший байт, нулевого элемента
> массива. т.е. автор подозревал что указатель ptrBuf, указывает
> на сразу на первый элемент массива, а там ещё содержится
> какая-то инфа. Верно?


Явной работы с байтами, в том числе младшими или старшими в приведенном коде нет.

ptrBuf - это указатель на массив структур.
ptrBuf^ - это разыменованный указатель на массив структур. То есть, по сути сам массив структур.
ptrBuf^[0] - это нулевой элемент массива структур. То есть, первая структура этого массива. Поставив после

ptrBuf^[0]

точку, вы сможете лицезреть список полей соответствующей структуры в подсказке Делфи.

Процедура FillChar первым параметром принимает не указатель, а собственно заполняемую (нулями или какими-нибудь другими байтами) переменную:

procedure FillChar(var X; Count: Integer; Value: Ordinal);

Например, если вы захотите обнулить с ее помощью Integer, то это будет выглядеть так:

var
 I: Integer;
begin
 FillChar(I, SizeOf(Integer), 0);


Если же вы хотите обнулить с ее помощью массив, то вы можете передать в нее первый элемент этого массива, что и происходит вот здесь:

FillChar(ptrBuf^[0],100500,0);

, так как у массива по определению все элементы расположены в памяти по порядку. В случае указателя на статический массив (то есть, в вашем случае) этот код аналогичен коду:

FillChar(ptrBuf^,100500,0);

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


> А выпиливать работающий (верно и быстро) чужой код, не есть
> хорошо.

Конечно не хорошо. Тогда выпиливайте свой, работающий неверно и медленно :).


fzt   (2011-09-20 05:31:00) [4]

Меня тоже такой добровольный отказ от выравнивания не радует.
но "Имя им Легион" © раз в этом коде встречается.


brother   (2011-09-20 05:20:00) [5]

> TTmpBuf = packedarray[0..Max-1] of TData;

меня смущает...


fzt   (2011-09-20 05:14:00) [6]

Хм.. сопровождаю код, имеются две идентичные на 99% символов и смысла процедуры (отличие в размерах записей и именованием буфера), манипулирующие буферами. Понадобилось впилить кой чего, и делать это в обе процедуры копипастом - не гуд (кажется это знать никому кроме меня и не нужно).

ИКР: на вход одной процедуре подать указатель на буфер, и размер записи. Что достаточно для работы с ними обоими (или N буферами в будущем).
Грубо говоря я буквы незнакомые встретил (второй месяц с Delphi работаю), и справка мне не помогла, может в силу одаренности - суть не в качестве устройства моего межушного нервного узла.
ptrBuf^[0]
А выпиливать работающий (верно и быстро) чужой код, не есть хорошо. Тогда каждый кодер будет тупо лабать свой код, про повторный юзинг не оформленого в модули/либы чужого модно забыть. Это потерям времени => убытки.

P.S. пока катал телегу) вроде дошло...
ptrBuf^[0] - указатель на младьший байт, нулевого элемента массива. т.е. автор подозревал что указатель ptrBuf, указывает на сразу на первый элемент массива, а там ещё содержится какая-то инфа. Верно?


Servy   (2011-09-20 05:02:00) [7]

Да, еще компилятор бы заругался на забытое двоеточие в операторе присваивания:


> lptr = ptrBuf;


Засим, есть мнение, что вы обманываете честной народ и показываете не тот код, который компилируете, а какой-то другой, который придумываете по ходу.


Servy   (2011-09-20 04:58:00) [8]


> [0]


То, что Pointer - не массив, и даже не указатель на массив. А просто указатель. Соответственно, операция "возьми-ка нулевой элемент этого массива" к нему неприменима, о чем вам вежливо намекает компилятор.


> строчка
> FillChar(ptrBuf^[0],100500,0);
> не моя, и я не понимаю что хотел этим "ptrBuf^[0]" добиться
> автор

Мотороллер не ваш, вы только объяву разместили?

Удалите чужие строчки и напишите свои, в которых вы понимаете, чего хотите добиться.

Вообще говоря, в приведенном вами коде обе строчки, судя по всему, служат одной и той же цели - заполнить что-то нулями:

FillChar(ptrBuf^[0],100500,0);
FillChar(lptr^[0],100500,0);


Так как lptr и ptrBuf - суть одно и то же, то зачем тут две такие строчки (одна из которых не компилируется) мне не ведомо. Возможно, одну из строчек стоить выпилить, хотя я бы выпилил всю программу, в которой происходят непонятные махинации с указателями без какого-либо намека на их смысл.

Кроме того, не приведен код выделения памяти под это дело или какой-нибудь еще инициализации указателей, так что в приведенном виде работать оно все-равно не будет.


fzt   (2011-09-20 04:49:00) [9]

Возможно верно так?

lptr = @ptrBuf;
FillChar(lptr,100500,0); //[Error] ххх.pas(): Array type required

строчка
FillChar(ptrBuf^[0],100500,0);
не моя, и я не понимаю что хотел этим "ptrBuf^[0]" добиться автор


Наверх

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