Форум: "Начинающим";
Текущий архив: 2011.12.25;
Скачать: [xml.tar.bz2];
ВнизПРоблемы с указателями Найти похожие ветки
← →
FZT (2011-09-20 04:44) [0]Господа, что я упускаю из вида, пытаясь так обратиться к указателю?
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;
← →
fzt (2011-09-20 04:49) [1]Возможно верно так?
lptr = @ptrBuf;
FillChar(lptr,100500,0); //[Error] ххх.pas(): Array type required
строчкаFillChar(ptrBuf^[0],100500,0);
не моя, и я не понимаю что хотел этим "ptrBuf^[0]" добиться автор
← →
Servy © (2011-09-20 04:58) [2]
> [0]
То, что Pointer - не массив, и даже не указатель на массив. А просто указатель. Соответственно, операция "возьми-ка нулевой элемент этого массива" к нему неприменима, о чем вам вежливо намекает компилятор.
> строчка
> FillChar(ptrBuf^[0],100500,0);
> не моя, и я не понимаю что хотел этим "ptrBuf^[0]" добиться
> автор
Мотороллер не ваш, вы только объяву разместили?
Удалите чужие строчки и напишите свои, в которых вы понимаете, чего хотите добиться.
Вообще говоря, в приведенном вами коде обе строчки, судя по всему, служат одной и той же цели - заполнить что-то нулями:FillChar(ptrBuf^[0],100500,0);
FillChar(lptr^[0],100500,0);
Так как lptr и ptrBuf - суть одно и то же, то зачем тут две такие строчки (одна из которых не компилируется) мне не ведомо. Возможно, одну из строчек стоить выпилить, хотя я бы выпилил всю программу, в которой происходят непонятные махинации с указателями без какого-либо намека на их смысл.
Кроме того, не приведен код выделения памяти под это дело или какой-нибудь еще инициализации указателей, так что в приведенном виде работать оно все-равно не будет.
← →
Servy © (2011-09-20 05:02) [3]Да, еще компилятор бы заругался на забытое двоеточие в операторе присваивания:
> lptr = ptrBuf;
Засим, есть мнение, что вы обманываете честной народ и показываете не тот код, который компилируете, а какой-то другой, который придумываете по ходу.
← →
fzt (2011-09-20 05:14) [4]Хм.. сопровождаю код, имеются две идентичные на 99% символов и смысла процедуры (отличие в размерах записей и именованием буфера), манипулирующие буферами. Понадобилось впилить кой чего, и делать это в обе процедуры копипастом - не гуд (кажется это знать никому кроме меня и не нужно).
ИКР: на вход одной процедуре подать указатель на буфер, и размер записи. Что достаточно для работы с ними обоими (или N буферами в будущем).
Грубо говоря я буквы незнакомые встретил (второй месяц с Delphi работаю), и справка мне не помогла, может в силу одаренности - суть не в качестве устройства моего межушного нервного узла.ptrBuf^[0]
А выпиливать работающий (верно и быстро) чужой код, не есть хорошо. Тогда каждый кодер будет тупо лабать свой код, про повторный юзинг не оформленого в модули/либы чужого модно забыть. Это потерям времени => убытки.
P.S. пока катал телегу) вроде дошло...
ptrBuf^[0] - указатель на младьший байт, нулевого элемента массива. т.е. автор подозревал что указатель ptrBuf, указывает на сразу на первый элемент массива, а там ещё содержится какая-то инфа. Верно?
← →
brother © (2011-09-20 05:20) [5]> TTmpBuf = packed array[0..Max-1] of TData;
меня смущает...
← →
fzt (2011-09-20 05:31) [6]Меня тоже такой добровольный отказ от выравнивания не радует.
но "Имя им Легион" © раз в этом коде встречается.
← →
Servy © (2011-09-20 05:33) [7]
> 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);
и приводит к заполнению массива нулями.
> А выпиливать работающий (верно и быстро) чужой код, не есть
> хорошо.
Конечно не хорошо. Тогда выпиливайте свой, работающий неверно и медленно :).
← →
Ega23 © (2011-09-20 08:39) [8]
FillChar(ptrBuf^[0],100500,0);
FillChar(lptr^,100500,0);
вроде так
← →
Ega23 © (2011-09-20 10:35) [9]
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;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.12.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c