Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Указатель на массив указателей в Delphi (http://forum.oszone.net/showthread.php?t=45665)

Server 19-02-2005 20:27 299976

Указатель на массив указателей в Delphi
 
Значит проблема в следующем. Пишу на Delphi. В функцию передаются указатель на массив указателей и размер массива. Вопрос вот в чем. А как использовать этот указатель на массив указателей. Нужно изменять значения переменных на которые указывают указатели в массиве. Непонятно, как работать с таким массивом.
Пробовал:
Poi: pointer;
@Massiv:=Poi;
не катит.

Помогите, пожалуйста.

Savant 19-02-2005 20:58 299983

Вам стоит почитать теорию ;) Особенно про использование указателей в 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.


Server 19-02-2005 21:43 299999

Теорией я владею. Просто раньше никогда с таким не сталкивался (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;

Savant 19-02-2005 21:47 300000

Server
Цитата:

Так я понял, что в вашем примере, процедура "знает", какого что переменная p - типа ppp, а в моем - нет.
Собственно а в чем проблема указать ему (компилятору) тип переменной, как я это сделал?

Server 19-02-2005 23:09 300033

Указал я тип переменной. Вынес описание массива выше в type. Но эффекта никакого не последовало.

Server 20-02-2005 20:42 300241

Я себе представляю это так: разыменовали указатель на массив указателей, получили массив указателей; разыменовали элемент массива - получили значение хранящееся в этой ячейке памяти. Вот мой полный код, 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.

Функция, которая вызывается в главной программе я уже описал выше. Помогите пожалуйста...

Server 20-02-2005 21:13 300245

А вот когда написал такой код, то компилятор говорит, мол не закрыл запись:
'(' 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.

Подскажите, что не так.

pva 18-03-2005 12:57 307939

в паскале `;` при описании фукции ставится, или я что-то подзабыл?
Код:

function func(a:integer) : integer;

function func(a:integer) : integer
begin
  ...
end;



Время: 05:45.

Время: 05:45.
© OSzone.net 2001-