Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1279537002
GanibalLector
2010-07-19 14:56
2010.10.10
Артефакты HINT а


11-1224874964
AnarchyMob
2008-10-24 23:02
2010.10.10
Использование диологовых окон из ресурсов


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


2-1279196896
istok
2010-07-15 16:28
2010.10.10
Now иногда возвращает ерунду...


15-1279008369
ixen
2010-07-13 12:06
2010.10.10
Есть ли такое?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский