Форум: "Начинающим";
Текущий архив: 2010.10.10;
Скачать: [xml.tar.bz2];
ВнизВозвращение динамических массивов в параметрах Найти похожие ветки
← →
Студент (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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.003 c