Главная страница
    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
15-1278780157
Jeer
2010-07-10 20:42
2010.10.10
Вот и я дошел до этой жизни..


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


15-1278662537
Дмитрий Тимохов
2010-07-09 12:02
2010.10.10
Системы бекапа и синхронизации


2-1279537002
GanibalLector
2010-07-19 14:56
2010.10.10
Артефакты HINT а


2-1279476319
lirikus
2010-07-18 22:05
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский