Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
ВнизКак передать в функцию как параметр двумерный динамический массив Найти похожие ветки
← →
Faustov (2002-11-10 17:54) [0]Как передать в функцию как параметр двумерный динамический массив?
Делал так
type Matr = array of array of real
...
function Func(var A,B: matr): boolean;
...
При вызове функции выдает ошибку Invalid Pointer
← →
MBo (2002-11-10 17:57) [1]a как объявлены a и B и сделано ли SetLength?
← →
Faustov (2002-11-10 18:39) [2]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;
← →
Faustov (2002-11-10 18:41) [3]пардон, опечатался, вот так:
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;
← →
Alex44 (2002-11-10 18:49) [4]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, pered SetLength(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 19:02) [5]Alex44 думаю, не в том проблема
Кто-нибудь использовал многомерный динамич. массив в качестве параметра функции???
← →
wssg (2002-11-10 19:18) [6]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;
← →
wssg (2002-11-10 19:28) [7]2Faustov
>SetLength(a,N,N);
>SetLength(b,N,N);
>У SetLength вроде всего два параметра...
Ошибся, SetLength(b,N,N); работает....
>При вызове функции выдает ошибку Invalid Pointer
А что в функции делается смотрели?
← →
Fantasist (2002-11-10 21:47) [8]Динамический массив - это указатель, так что передавать его как 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;
← →
Fantasist (2002-11-10 21:52) [9]Да совсем забыл.
Faustov : приведенный кусок кода ничего криминального не содержит. Покажи функцию.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c