|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Указатель на массив указателей в Delphi |
|
|
Delphi - Указатель на массив указателей в Delphi
|
|
Пользователь Сообщения: 59 |
Значит проблема в следующем. Пишу на Delphi. В функцию передаются указатель на массив указателей и размер массива. Вопрос вот в чем. А как использовать этот указатель на массив указателей. Нужно изменять значения переменных на которые указывают указатели в массиве. Непонятно, как работать с таким массивом.
Пробовал: Poi: pointer; @Massiv:=Poi; не катит. Помогите, пожалуйста. |
|
|
------- Отправлено: 20:27, 19-02-2005 |
|
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить 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
|
Профиль | Сайт | Отправить 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 | |
|