|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Указатель на массив указателей в Delphi |
|
Delphi - Указатель на массив указателей в Delphi
|
Пользователь Сообщения: 59 |
Значит проблема в следующем. Пишу на Delphi. В функцию передаются указатель на массив указателей и размер массива. Вопрос вот в чем. А как использовать этот указатель на массив указателей. Нужно изменять значения переменных на которые указывают указатели в массиве. Непонятно, как работать с таким массивом.
Пробовал: Poi: pointer; @Massiv:=Poi; не катит. Помогите, пожалуйста. |
|
------- Отправлено: 20:27, 19-02-2005 |
![]() Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Вам стоит почитать теорию
![]() Ну а пока вот решение проблемы, если надо что-то более конкретное, спрашивайте... 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
|
Профиль | Сайт | Отправить 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; |
------- Отправлено: 21:43, 19-02-2005 | #3 |
![]() Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Server
Цитата:
|
|
Отправлено: 21:47, 19-02-2005 | #4 |
Пользователь Сообщения: 59
|
Профиль | Сайт | Отправить PM | Цитировать Указал я тип переменной. Вынес описание массива выше в type. Но эффекта никакого не последовало.
|
|
------- Отправлено: 23:09, 19-02-2005 | #5 |
Пользователь Сообщения: 59
|
Профиль | Сайт | Отправить 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. Функция, которая вызывается в главной программе я уже описал выше. Помогите пожалуйста... |
------- Отправлено: 20:42, 20-02-2005 | #6 |
Пользователь Сообщения: 59
|
Профиль | Сайт | Отправить 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. Подскажите, что не так. |
------- Отправлено: 21:13, 20-02-2005 | #7 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать |
Отправлено: 12:57, 18-03-2005 | #8 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Теория - Указатель на многомерный массив (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 |
|