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.