Главная страница
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.01 c
2-1279601277
Андрей_1
2010-07-20 08:47
2010.10.10
Цвет шрифта DBGrid


2-1279176225
Шел мимо решил зайти
2010-07-15 10:43
2010.10.10
забрать файлик


15-1278880180
Юрий
2010-07-12 00:29
2010.10.10
С днем рождения ! 12 июля 2010 понедельник


15-1278867791
Дмитрий Белькевич
2010-07-11 21:03
2010.10.10
Восьмая. В Сеть попала презентация ОС Windows 8


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