![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как передать в функцию как параметр двумерный динамический массив
Faustov © (2002-11-10 17:54:00)Как передать в функцию как параметр двумерный динамический массив?
Делал так
type Matr = array of array of real
...
function Func(var A,B: matr): boolean;
...
При вызове функции выдает ошибку Invalid Pointer
Fantasist (2002-11-10 21:52:00) [1]Да совсем забыл.
Faustov : приведенный кусок кода ничего криминального не содержит. Покажи функцию.
Fantasist (2002-11-10 21:47:00) [2]Динамический массив - это указатель, так что передавать его как var параметр большого смысла не имеет - в любом случае передается только указатель, а значит массив будет меняться в любом случае. Разве что ты там делаешь такие конструкции:
function f1(var a,b:TMatr):boolean;
begin
a:=b; //здесь
SetLength(a,7,7); //и здесь имеет значение есть ли модификатор var перед паметрами.
end;
function f1(a,b:TMatr):boolean;
begin
a[5,5]:=7; //здесь это значения не имеет. переданный массив измениться.
end;
wssg (2002-11-10 19:28:00) [3]2Faustov
>SetLength(a,N,N);
>SetLength(b,N,N);
>У SetLength вроде всего два параметра...
Ошибся, SetLength(b,N,N); работает....
>При вызове функции выдает ошибку Invalid Pointer
А что в функции делается смотрели?
wssg (2002-11-10 19:18:00) [4]2Faustov
>SetLength(a,N,N);
>SetLength(b,N,N);
У SetLength вроде всего два параметра...
И вот простой пример использования динамического двумерного массива:
...
TArr = array of array of integer;
...
procedure TForm1.FillArr(var ar: TArr);
var i,j:integer;
begin
for i:=Low(ar) to High(ar) do
for j:=Low(ar[i]) to High(ar[i]) do
ar[i,j]:=Random(1000);
end;
procedure TForm1.Button1Click(Sender: TObject);
var a:Tarr;
i,j:integer;
begin
SetLength(a,10);
for i:=Low(a) to High(a) do
SetLength(a[i],10);
FillArr(a);
for i:=Low(a) to High(a) do
for j:=LOw(a[i]) to High(a[i]) do
Memo1.Lines.Add(IntToStr(a[i,j])+" ");
end;
Faustov (2002-11-10 19:02:00) [5]Alex44 думаю, не в том проблема
Кто-нибудь использовал многомерный динамич. массив в качестве параметра функции???
Alex44 (2002-11-10 18:49:00) [6]Ya dumayu, chto eto ochen" ne trivial"naya constructsiya.
Kogda Vy delaete SetLength(A, n), to ne ochevidno, chto vse elementy A[i] proinitializirovany, i kogda Vy delaete
for I := 0 to n-1 do SetLength(A[i], m);
mozhet vyskochit" access violation. Dazhe esli net, potom, peredSetLength(A, NewN) Vam pridetsya snachala
for I := 0 to n-1 do SetLength(A[i], 0);
dlya osvobozhdeniya pamyati. Mozhet, ya ne prav i Delphi podderzhivaet mnogomernye dynamic arrays? Kto znaet?
V lyubom sluchae, eto nemnogo nadumano, t.k. lyuboj massiv v dushe odnomeren. Mozhno opredelit"
type Matr = record
m, n: Integer;
Entries: array of real;
end
a luchshe dazhe
type Matr = class
private
Fm, Vn: Integer;
FEntries: array of real;
...
public
property n: Integer read Fn write SetN;
...
property Entrie[i, j: Integer]: real read GetEntrie write SetEntrie; default;
end;
procedure Matr.SetN(Value: Integer);
begin
if Value <> Fn then begin
Fn := Value;
SetLength(FEntries, Fn*Fm);
end;
end;
function Matr.GetEntry(i, j: Integer): real;
begin
// if invalid values are possible, insert range check here
Result := FEntries[(i-1)*(Fm-1) + J-1];
end;
Nu, i ne zabyt" SetLength(FEntries, 0) v Matr.Destroy;
Faustov (2002-11-10 18:41:00) [7]пардон, опечатался, вот так:
procedure TForm8.Button1Click(Sender: TObject);
var a,b: Matr;
i,j:integer;
begin
SetLength(a,N,N);
SetLength(b,N,N);
...
Func(a,b);
end;
Faustov (2002-11-10 18:39:00) [8]2MBo
procedure TForm8.Button1Click(Sender: TObject);
var a,b: Matr;
i,j:integer;
begin
SetLength(a,N,N);
SetLength(a,N,N);
...
Func(a,b);
end;
MBo (2002-11-10 17:57:00) [9]a как объявлены a и B и сделано ли SetLength?