![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ПРоблемы с указателями [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]" добиться автор