Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.25;
Скачать: CL | DM;

Вниз

ПРоблемы с указателями   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
15-1314949594
xayam
2011-09-02 11:46
2011.12.25
Распределение нагрузки при загрузке сайта


2-1316145462
i2e
2011-09-16 07:57
2011.12.25
Узнать ширину/высоту полосы прокрутки


15-1315419704
неокубинец
2011-09-07 22:21
2011.12.25
Подскажите по подключению монитора


15-1315415972
ClawClaw
2011-09-07 21:19
2011.12.25
Индиана Джонс (лего)


2-1316362141
Pcrepair
2011-09-18 20:09
2011.12.25
Отобразить hwnd в Label1 или Edit1