Як передати в функцію як параметр двовимірний динамічний масив
Як передати в функцію як параметр двовимірний динамічний масив?
робив так
type Matr = array of array of real
.
function Func (var A, B: matr): boolean;
.
При виконанні функції видає помилку Invalid Pointer
a як оголошені a і B і зроблено чи SetLength?
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;
пардон, опечатали, ось так:
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;
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;
Alex44 думаю, не в тому проблема
Хто-небудь використовував багатовимірний динамічний. масив як параметр функції.
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;
2Faustov
> SetLength (a, N, N);
> SetLength (b, N, N);
> У SetLength начебто лише два параметри.
Помилився, SetLength (b, N, N); працює.
> При виконанні функції видає помилку Invalid Pointer
А що в функції робиться дивилися?
Динамічний масив - це покажчик, так що передавати його як 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;
Так зовсім забув.
Faustov. наведений шматок коду нічого кримінального не містить. Покажи функцію.