Як передати в функцію як параметр двовимірний динамічний масив

Як передати в функцію як параметр двовимірний динамічний масив

Як передати в функцію як параметр двовимірний динамічний масив?
робив так
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. наведений шматок коду нічого кримінального не містить. Покажи функцію.