Главная страница
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.011 c
6-1226168858
nes
2008-11-08 21:27
2010.10.10
Idhttp: время ответа при запросе


15-1278957018
Дмитрий С
2010-07-12 21:50
2010.10.10
Планировщик заданий как модуль apache


3-1246013703
zerohold
2009-06-26 14:55
2010.10.10
Delphi connect to MySQL через SSH


2-1279193322
Aleks
2010-07-15 15:28
2010.10.10
Экспорт ListView в эксель


6-1226928849
com
2008-11-17 16:34
2010.10.10
узнать, есть ли открытые смб-ресурсы на конкретном ип