Com Passar Una Matriu A Una Funció

Taula de continguts:

Com Passar Una Matriu A Una Funció
Com Passar Una Matriu A Una Funció

Vídeo: Com Passar Una Matriu A Una Funció

Vídeo: Com Passar Una Matriu A Una Funció
Vídeo: Matriz traspuesta 2024, Abril
Anonim

Les matrius són una de les formes d’emmagatzematge de dades estructurades més utilitzades en programes d’ordinador. El seu processament es pot fer mitjançant diversos algoritmes implementats en mètodes i funcions de classe. En conseqüència, sovint es requereix passar una matriu a una funció. Els llenguatges C i C ++ ofereixen una gran llibertat a l’hora d’escollir els mètodes de realització d’aquesta acció.

Com passar una matriu a una funció
Com passar una matriu a una funció

És necessari

compiladors de llenguatges C i C ++

Instruccions

Pas 1

Passeu una matriu de mida fixa a la funció. Canvieu el prototip de la funció per contenir un argument del tipus adequat. Per exemple, la declaració d'una funció que pren una matriu de valors numèrics enters de tres elements com a paràmetre podria ser així:

void ArrayFunction (int aNumbers [3]);

Aquesta funció s'anomena passant una matriu directament a ella com a argument:

void SomeFunction ()

{

int aNombres = {1, 2, 3};

ArrayFunction (aNumbers);

}

Les dades transferides es copien a la pila. La modificació de la matriu a la funció anomenada no canvia la font.

Pas 2

Passeu matrius de longitud variable a la funció. Per fer-ho, simplement no especifiqueu la dimensió de l'argument corresponent:

void ArrayFunction (int aNumbers );

Les matrius multidimensionals també es poden passar d'una manera similar (només la primera "dimensió" pot ser variable):

void ArrayFunction (int aNumbers [3] [2]);

Aquestes funcions s’anomenen de la mateixa manera que en el primer pas.

Per poder processar correctament matrius de longitud variable en una funció, heu de passar explícitament el nombre dels seus elements mitjançant un paràmetre addicional o utilitzar convencions que imposen restriccions als valors dels propis elements (un valor determinat ha de ser un signe del final de la matriu).

Pas 3

Passeu la matriu per punter. L'argument de funció ha de ser un punter cap a un valor amb un tipus que correspongui als elements de la matriu. Per exemple:

void ArrayFunction (int * pNumbers);

L'accés a les dades d'una funció es pot dur a terme tant en la notació per treballar amb elements de matriu, com mitjançant l'aritmètica d'adreces:

void ArrayFunction (int * pNumbers)

{

pNombres [0] = 10; // accés a l’element 0

* (pNombres + 1) = 20; // accés a l’element 1

}

Ves amb compte! Com que la funció no es transmet una còpia de les dades, sinó un punter, la matriu original es modificarà.

L’avantatge d’aquest mètode és la rapidesa, l’economia dels recursos computacionals i una certa flexibilitat. Per tant, podeu trucar a la funció de destinació passant-li un punter a un element arbitrari de la matriu:

void SomeFunction ()

{

int aNombres = {1, 2, 3};

ArrayFunction (aNumbers); // tota la matriu

ArrayFunction (& aNumbers [1]); // a partir del segon element

}

Aquest mètode també sol implicar passar el nombre d'elements disponibles en un paràmetre addicional o utilitzar un terminador de matriu.

Pas 4

Passeu les dades a una funció amb un paràmetre que sigui un objecte o una referència a un objecte de la classe que implementi la funcionalitat de la matriu. Aquestes classes o plantilles de classes solen trobar-se a biblioteques i frameworks populars (QVector a Qt, CArray a MFC, std:: vector a STL, etc.).

Sovint, aquestes classes implementen una estratègia implícita per compartir dades amb el recompte de referències, realitzant una còpia profunda només quan es modifiquen les dades (còpia en escriptura). Això us permet minimitzar el consum de recursos computacionals fins i tot en el cas de passar objectes de matriu per valor mitjançant els arguments de funcions i mètodes:

void ArrayFunction (QVector oArray)

{

intCompte nítem = oArray.count ();

int nItem = oArray [0];

}

void SomeFunction ()

{

QVector oArray (10);

per a (int i = 0; i

Recomanat: