Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Указатель на массив указателей в Delphi

Ответить
Настройки темы
Delphi - Указатель на массив указателей в Delphi

Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

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

-------
Windows 2000 forever!


Отправлено: 20:27, 19-02-2005

 

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 20:58, 19-02-2005 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Windows 2000 forever!


Отправлено: 21:43, 19-02-2005 | #3


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 21:47, 19-02-2005 | #4


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Windows 2000 forever!


Отправлено: 23:09, 19-02-2005 | #5


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

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

-------
Windows 2000 forever!


Отправлено: 20:42, 20-02-2005 | #6


Пользователь


Сообщения: 59
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


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

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

-------
Windows 2000 forever!


Отправлено: 21:13, 20-02-2005 | #7

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


в паскале `;` при описании фукции ставится, или я что-то подзабыл?
Код: Выделить весь код
function func(a:integer) : integer;

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

Отправлено: 12:57, 18-03-2005 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Указатель на массив указателей в Delphi

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Теория - Указатель на многомерный массив (Pascal) Kowu Программирование и базы данных 2 02-11-2009 22:09
Разное - Схемы указателей и звуков Windows echo off Microsoft Windows 2000/XP 1 20-09-2008 17:45
C/C++ - Динамическое выделение памяти с помощью new и присваивание указателей mrcnn Программирование и базы данных 1 29-07-2008 17:00
Указатель на метод в C++ pva Программирование и базы данных 4 08-04-2004 09:57
Можно ли создать указатель на указатель? Sharkky Программирование и базы данных 2 24-09-2003 14:35




 
Переход