Главная страница
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.019 c
4-94243
Matrex
2003-12-21 19:31
2004.02.29
Свойства папки (файла)


14-94177
Soft
2004-02-06 22:34
2004.02.29
Что дyмают о pyсских пpогpаммистах их западные коллеги


6-94062
NoIdeaAboutName
2003-12-22 22:52
2004.02.29
Как отловить установление dialup соединения,.


8-94036
mazepa
2003-10-09 15:22
2004.02.29
Распознавание речи


6-94058
roadstar
2003-12-24 14:25
2004.02.29
По NetShareAdd