Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.10.10;
Скачать: CL | DM;

Вниз

Возвращение динамических массивов в параметрах   Найти похожие ветки 

 
Студент   (2010-07-19 23:19) [0]

Помогите разобраться:

procedure Proc1(out Result: array of string);
begin
 SetLength(Result, 1); // Это не работает, "Несоответствие типов" говорит. Почему?
 Result[0] := "Hallo";
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 A: array of string;
begin
 Proc1(A);
end;


В общем-то, я так себе понимаю, что массив передается как указатель на область памяти, а попытка перевыделить память приведет к изменению этого указателя. Поэтому компилятор и делает этот указатель константным, чтобы не изменялся указатель на возвращаемые данные (?). Но почему тогда оно никак не обрабатывает out? Ведь это возвращаемый параметр. Подскажите, что я тут не так понимаю?

Потом, в процессе раздумий, переделал на вот такое:

type
 TStringArray = array of string;
 PStringArray = ^TStringArray;

procedure Proc2(out Result: TStringArray);
begin
 SetLength(Result, 4);
 Result[0] := "Hallo";
 Result[1] := ", ";
 Result[2] := "world";
 Result[3] := "!";
end;

procedure TForm1.Button2Click(Sender: TObject);
var
 A: TStringArray;
begin
 Proc2(A);
end;


Вот как по мне, так второй вариант точная копия второго, просто выделен общий тип данных. Но второй вариант компилируется и работает, а первый - нет.

И еще вопрос: Во втором варианте не будет утечки памяти?


 
Плохиш ©   (2010-07-20 00:09) [1]


> procedure Proc1(out Result: array of string);
>

Описывает открытый массив

>  TStringArray = array of string;
>

Описывает динамический массив

PS. Я конечно понимаю, что читать документацию и справку не дело крютых недостудентов.


 
Студент   (2010-07-20 01:02) [2]

> Плохиш ©   (20.07.10 00:09) [1]
> PS. Я конечно понимаю, что читать документацию и справку
> не дело крютых недостудентов.


Ты когда-нибудь пробовал читать справку в Turbo Delphi? На "array" выдает одну ссылку на то, что это зарезервированное слово, две ссылки на раздел JScript и три ссылки на Microsoft Scripting Technologies. Что из этого предлагаешь почитать?

P.S. Тебя разве не добили в 1917-м красные каббальчиши? Зря.

P.P.S. Если тебя раздражают такие вопросы, то, может, не будешь заходить в раздел "Начинающим"? А то еще один такой дружелюбный ответ - и я сюда заходить не буду. Будешь вариться в собственной желчи. Впрочем, раньше сваришься. Что, впрочем, к лучшему.


 
Германн ©   (2010-07-20 01:55) [3]


> Студент   (20.07.10 01:02) [2]

Успокойся. Если бы ты читал учебники, то такого вопроса просто не было бы. Но Плохиш ответил достаточно чтобы дать намёк на причину твоей ошибки.

> > procedure Proc1(out Result: array of string);
> >
>
> Описывает открытый массив
>

Именно так. Параметр Result заявлен именно как "открытый массив" (open array). Динамический массив так объявлять в описании процедуры нельзя!
Как его нужно объявлять Плохиш тоже сказал
> >  TStringArray = array of string;
> >
>
> Описывает динамический массив

Небольшое усилие мысли и о счастье!
procedure Proc1(out Result: TStringArray);

Ну и ещё. Result - зарезервированное слово в Дельфи. И не стоит его использовать для своих переменных.

P.S.

> Ты когда-нибудь пробовал читать справку в Turbo Delphi?

Пробовали. Много раз пробовали.
Недоделанная она. Ну и что?



Страницы: 1 вся ветка

Текущий архив: 2010.10.10;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
2-1279196896
istok
2010-07-15 16:28
2010.10.10
Now иногда возвращает ерунду...


6-1226681305
Netter
2008-11-14 19:48
2010.10.10
Скачивание файла


2-1279003263
И. Павел
2010-07-13 10:41
2010.10.10
RecordCount и все, что с ним связано


15-1279013407
Knight
2010-07-13 13:30
2010.10.10
Почему TServerSocket при отключении клиента...


9-1188184458
TGLActor
2007-08-27 07:14
2010.10.10
Как поменять местами MeshObjects в TGLFreeForm в GLScene?