Cum să transmiteți o funcție ca parametru unei matrice dinamice bidimensionale

Cum să transmiteți o funcție ca parametru unei matrice dinamice bidimensionale

Cum pot trece o matrice dinamică bidimensională unei funcții ca parametru?
Așa
tip Matr = matricea matricei reale
.
funcția Func (var A, B: matr): boolean;
.
Când este apelată funcția, aceasta emite o eroare Pointer nevalid

a Cum sunt declarate a și B și este stabilit Lungimea?

procedura TForm8.Button1Click (expeditor: TObject);
var a, b: Matr;
i, j: întreg;
începe
Set Lungime (a, N, N);
Set Lungime (a, N, N);
.
Func (a, b);
se încheie;

Îmi pare rău, sigilat în felul următor:

procedura TForm8.Button1Click (expeditor: TObject);
var a, b: Matr;
i, j: întreg;
începe
Set Lungime (a, N, N);
Set Lungime (b, N, N);
.
Func (a, b);
se încheie;

pentru I: = 0 la n-1 face SetLength (A [i], m);

mozhet vyskochit "violare a accesului. Dazhe esli net, apoi, pered SetLength (A, NewN) Vam pridetsya snachala

pentru I: = 0 până la n-1 a SetLength (A [i], 0);

dlya osvobozhdeniya pamyati. Mozhet, ai ne-adevărat Delphi podderzhivaet mnogomernye dinamice arrays? Cine znaet?

V lyubom sluchae, eto nemnogo nadumano, t.k. lyuboj massiv v dushe odnomeren. Mozhno opredelit "


tip Matr = înregistrare
m, n: Integer;
Intrări: matrice reală;
capăt

o luchshe dazhe


tip Matr = clasa
privat
Fm, Vn: Integer;
FEntries: matrice reală;
.
public
proprietatea n: Integer citește Fn scrie SetN;
.
proprietate Entrie [i, j: Integer]: citit real GetEntrie write SetEntrie; implicit;
se încheie;

procedura Matr.SetN (valoare: Integer);
începe
dacă valoarea <> Fn începe apoi
Fn: = valoare;
SetLength (FEntries, Fn * Fm);
se încheie;
se încheie;

funcția Matr.GetEntry (i, j: Integer): real;
începe
// dacă sunt posibile valori nevalide, introduceți aici intervalul de verificare
Rezultat: = FEntries [(i-1) * (Fm-1) + J-1];
se încheie;

Nu, i nu blocat "SetLength (FEntries, 0) v Matr.Destroy;

Alex44 Cred că asta nu este problema
Cineva a folosit o dinamică multidimensională. array ca parametru de funcții.

2Faustov
> SetLength (a, N, N);
> SetLength (b, N, N);
SetLength pare să aibă doar doi parametri.

Iată un exemplu simplu de utilizare a unei matrice bidimensionale dinamice:

.
TArr = matricea matricei întregi;
.
procedura TForm1.FillArr (var ar: TArr);
var i, j: întreg;
începe
pentru i: = scăzut (ar) la mare (ar) face
pentru j: = Scăzut (ar [i]) la Ridicat (ar [i])
ar [i, j]: = Random (1000);
se încheie;

procedura TForm1.Button1Click (expeditor: TObject);
var a: Tarr;
i, j: întreg;
începe
SetLength (a, 10);
pentru i: = Scăzut (a) la Ridicat (a)
SetLength (a [i], 10);
FillArr (a);
pentru i: = Scăzut (a) la Ridicat (a)
pentru j: = LOw (a [i]) la Ridicat (a [i])
Memo1.Lines.Add (IntToStr (a [i, j]) + "");
se încheie;

2Faustov
> SetLength (a, N, N);
> SetLength (b, N, N);

> La SetLength ca doar doi parametri.

Erori, SetLength (b, N, N); Acesta funcționează.

> Se apelează funcția Pointer nevalid
Și care este funcția pe care o analizăm?

O matrice dinamică este un pointer, deci nu prea are sens să o transmiteți ca parametru var - în orice caz, numai pointerul este trecut și astfel matricea se va schimba în orice caz. Aceasta este ceea ce faci acolo sunt astfel de construcții:

funcția f1 (var a, b: TMatr): boolean;
începe
a: = b; // aici
SetLength (a, 7,7); // si aici conteaza daca exista un modificator var inaintea parametrilor.
se încheie;


funcția f1 (a, b: TMatr): boolean;
începe
a [5,5]: = 7; // aici nu contează. matricea transferată se va schimba.
se încheie;

Da, am uitat complet.
Faustov. Codul dat nu conține nimic criminal. Afișați funcția.