Показать полную графическую версию : Указатель на массив указателей в Delphi
Значит проблема в следующем. Пишу на Delphi. В функцию передаются указатель на массив указателей и размер массива. Вопрос вот в чем. А как использовать этот указатель на массив указателей. Нужно изменять значения переменных на которые указывают указатели в массиве. Непонятно, как работать с таким массивом.
Пробовал:
Poi: pointer;
@Massiv:=Poi;
не катит.
Помогите, пожалуйста.
Вам стоит почитать теорию ;) Особенно про использование указателей в Object Pascal.
Ну а пока вот решение проблемы, если надо что-то более конкретное, спрашивайте...
program Project;
{$APPTYPE CONSOLE}
type
aaa = array[1..10] of Pointer;
ppp = ^aaa;
procedure pointerArray(p: ppp; Low,High: Integer);
var
ik: Integer;
begin
for ik:=Low to High do
WriteLn(Integer(p^[ik]),Integer(p^[ik]^));
// p^[ik] выдает *адрес* переменной, в нашем случае - переменной 'i'
// p^[ik]^ выдает *значение* переменной типа Integer по адресу p^[ik],
// в нашем случае это - 11, т.е. значение после выполнения цикла for
end;
var
var_a: aaa;
i: Integer;
begin
for i:=1 to 10 do
var_a[i]:=@i;
// после выполнения цикла for переменная i = 11
PointerArray(@var_a,1,10);
ReadLn;
end.
Теорией я владею. Просто раньше никогда с таким не сталкивался (Visual C не в счет).
В моем случае проблема состоит в том, что нужно реализовать данную функцию в DLL. То есть создается динамический массив.
Вот мой (приблизительный) код:
function DLLExecute(I:pointer;ISize:smallint):boolean;
var
L:smallint;
IntMas:array of integer;
begin
setlength(intmas,isize);
for L:=1 to Isize do begin
IntMas[L]:=integer(I^[L]^);
end;
DLLExec:=true;
end;
При реализации такого кода Delphi указывает на строку IntMas[L]:=integer(I^[L]^) и говорит, что Array type Required. Так я понял, что в вашем примере, процедура "знает", какого что переменная p - типа ppp, а в моем - нет.
А вот кусок главной программы (находится вообще в другой папке):
var
DLLExecute:function(I:pointer;ISize:smallint):boolean;
begin
DLLExecute(@IntMas,47);
end;
Server
Так я понял, что в вашем примере, процедура "знает", какого что переменная p - типа ppp, а в моем - нет.
Собственно а в чем проблема указать ему (компилятору) тип переменной, как я это сделал?
Указал я тип переменной. Вынес описание массива выше в type. Но эффекта никакого не последовало.
Я себе представляю это так: разыменовали указатель на массив указателей, получили массив указателей; разыменовали элемент массива - получили значение хранящееся в этой ячейке памяти. Вот мой полный код, DLL (плагины):
library FirstPlugin;
uses
Forms, StdCtrls, Graphics, Controls, Classes, ExtCtrls;
{$R *.res}
function PluginExec(I,R,S,B:array of pointer;ISize,RSize,SSize,BSize:smallint):boolean;
begin
PluginExec:=true;
end;
exports PluginExec;
end.
Функция, которая вызывается в главной программе я уже описал выше. Помогите пожалуйста...
А вот когда написал такой код, то компилятор говорит, мол не закрыл запись:
'(' expected but ',' found - Строка k:smallint;
';' expected but 'FOR' found - Строка begin
'.' expected but ';' found - Строка IntMas[k]:=I^[k];
library FirstPlugin;
uses
Forms, StdCtrls, Graphics, Controls, Classes, ExtCtrls;
{$R *.res}
type
IntMas = array of pointer;
PIntMas = ^IntMas;
function PluginExec(I,R,S,B:PIntMas;ISize,RSize,SSize,BSize:smallint):boolean;
var
Form1: TForm;
k:smallint;
begin
Application.CreateForm(TForm, Form1);
setlength(IntMas,Isize);
for k:=0 to ISize do
IntMas[k]:=I^[k];
Form1.ShowModal;
PluginExec:=true;
end;
exports PluginExec;
end.
Подскажите, что не так.
в паскале `;` при описании фукции ставится, или я что-то подзабыл?
function func(a:integer) : integer;
function func(a:integer) : integer
begin
...
end;
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.