Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1315829392
Vjcr
2011-09-12 16:09
2011.12.25
php цикл по датам


2-1316200336
Аня
2011-09-16 23:12
2011.12.25
Помогите пожалуйста!


15-1315427389
Юрий
2011-09-08 00:29
2011.12.25
С днем рождения ! 8 сентября 2011 четверг


2-1316422466
Scott Storch
2011-09-19 12:54
2011.12.25
как правильнее организовать доступ к списку из 2-х процедур


4-1252568961
Гриня
2009-09-10 11:49
2011.12.25
Взаимодействие с Opera





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский