Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.29;
Скачать: CL | DM;

Вниз

Передача динамическиго массива в процедуру....   Найти похожие ветки 

 
tipman ©   (2004-02-16 09:24) [0]

Делаю так:

var AString:array of String;

procedure qwerty(var temp:array of String);
var i:integer;
begin
i:=5;
SetLength(temp,i);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
qwerty(AString);
end;

Пишет ошибку о несовместимости типов. Как надо сделать чтобы это работало?


 
Kerk ©   (2004-02-16 09:51) [1]

Надо так:

type
TStrArr = array of string;
var
AString: TStrArr;
procedure qwerty( var temp: TStrArr);
...

Только вот выделенный var совсем не нужен!


 
Тимохов ©   (2004-02-16 10:47) [2]


> Kerk © (16.02.04 09:51) [1]
> Только вот выделенный var совсем не нужен!

Что значит не нужен?
Если его не будет результат из qwerty не возвратится.


 
Skier ©   (2004-02-16 10:55) [3]


> Как надо сделать чтобы это работало?

Тип объявить.


 
Kreon ©   (2004-02-16 21:07) [4]

Можешь перед var temp:array of String поставить @ - этот оператор говорит чтобы типы на совместимость не проверялись. А вообще не гарантирую, самне пробовал


 
Defunct ©   (2004-02-16 21:21) [5]

> Что значит не нужен?
> Если его не будет результат из qwerty не возвратится.


А Вы думаете динамический массив копируется целиком в процедуру?
Динамический массив это массив ссылок, т.е. Var там не нужен.

> Kreon © (16.02.04 21:07) [4]
> Можешь перед var temp:array of String поставить @ - этот оператор говорит чтобы типы на совместимость не проверялись. А вообще не гарантирую, самне пробовал


Во-первых @ это не оператор (оператор относится к действиям, нельзя написать "@;"), во-вторых перед var "@" поставить нельзя. @ - означает адрес переменной. При описании параметров процедуры, результат одниковый, что написать var myparam, что @myparam.


 
Defunct ©   (2004-02-16 21:40) [6]

Оговорка: напрямую использование значка @ при описании процедуры невозможна, применительно к данному сабжу пишут обычно так:

Type TMyDynamicArray = Array of String;
TMyDynamicArrayPtr = ^TMyDynamicArray;

Var AString : TMyDynamicArray;

Procedure Query(MyStrings: TMyDynamicArrayPtr; NewLength:Integer);
Begin
SetLength( MyStrings^, NewLength);
End;

Procedure UseQuery;
Begin
Query(@AString, 5);
End;


 
MBo ©   (2004-02-17 07:07) [7]

>Динамический массив это массив ссылок, т.е. Var там не нужен
It depends...
В примере автора как раз var нужно - поскольку в процедуре происходит перераспреределение памяти, содержимое temp будет указывать на другую область памяти, а без var внешняя процедура об этих изменениях не узнает.

пример (раскомментировать var в заголовке)
вариант без var здесь даже опасен.


procedure TForm1.Button2Click(Sender: TObject);
type
TA=array of Integer;
var
a:TA;

procedure Work( {var} Temp:TA);
begin
SetLength(Temp,10);
Temp[0]:=10;
end;

begin
SetLength(a,1);
a[0]:=1;
Work(A);
Caption:=IntToStr(a[0]);
end;



 
Тимохов ©   (2004-02-17 11:06) [8]


> MBo © (17.02.04 07:07) [7]


> В примере автора как раз var нужно

Спасибо за поддержку - с Defunct сложно спорить - он дельфи знает лучше всех.



Страницы: 1 вся ветка

Текущий архив: 2004.02.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
1-93866
Bannikov
2004-02-16 11:52
2004.02.29
DefineProperties ?


3-93758
ALEX2
2004-02-03 19:49
2004.02.29
как можно получить значения вводимые в TBDGRID


7-94197
DENIS_PY
2003-12-11 10:30
2004.02.29
как когда ставишь ловушку setwindowshookex


3-93797
Victor!
2004-01-31 15:12
2004.02.29
Вопрос по Microsoft Jet


6-94056
mix.4ever
2003-12-05 12:31
2004.02.29
Удаленный десктоп