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