Tablourile sunt una dintre cele mai utilizate forme de stocare a datelor structurate în programele de computer. Prelucrarea lor se poate face prin diverși algoritmi implementați în metode și funcții de clasă. În consecință, este deseori necesar să treci un tablou către o funcție. Limbajele C și C ++ oferă o mare libertate în alegerea metodelor de efectuare a acestei acțiuni.
Este necesar
compilatoare de limbaje C și C ++
Instrucțiuni
Pasul 1
Treceți o matrice de dimensiuni fixe funcției. Schimbați prototipul funcției pentru a conține un argument de tipul corespunzător. De exemplu, declarația unei funcții care ia un set de valori numerice întregi a trei elemente ca parametru ar putea arăta astfel:
void ArrayFunction (int aNumbers [3]);
O astfel de funcție se numește trecând o matrice direct la ea ca argument:
void SomeFunction ()
{
int aNumere = {1, 2, 3};
ArrayFunction (aNumbers);
}
Datele transferate sunt copiate în stivă. Modificarea matricei în funcția apelată nu modifică sursa.
Pasul 2
Treceți matrici de lungime variabilă către funcție. Pentru a face acest lucru, pur și simplu nu specificați dimensiunea argumentului corespunzător:
void ArrayFunction (int aNumbers );
Tablourile multidimensionale pot fi, de asemenea, transmise într-un mod similar (doar prima „dimensiune” poate fi variabilă):
void ArrayFunction (int aNumbers [3] [2]);
Aceste funcții sunt numite în același mod ca în primul pas.
Pentru a putea procesa corect matrici de lungime variabilă într-o funcție, trebuie fie să treceți în mod explicit numărul de elemente ale acestora printr-un parametru suplimentar, fie să utilizați convenții care impun restricții asupra valorilor elementelor în sine (o anumită valoare trebuie să fie un semn al sfârșitului matricei).
Pasul 3
Treceți matricea prin pointer. Argumentul funcției trebuie să fie un pointer către o valoare cu un tip corespunzător elementelor matricei. De exemplu:
void ArrayFunction (int * pNumbers);
Accesul la date într-o funcție poate fi realizat atât în notație pentru lucrul cu elemente de matrice, cât și folosind aritmetica adreselor:
void ArrayFunction (int * pNumbers)
{
pNumere [0] = 10; // acces la elementul 0
* (pNumere + 1) = 20; // acces la articolul 1
}
Atenție! Deoarece funcția este transmisă nu o copie a datelor, ci un indicator către aceasta, matricea originală va fi modificată.
Avantajul acestei metode este viteza, economia resurselor de calcul și o anumită flexibilitate. Deci, puteți apela funcția țintă trecând-o un pointer către un element arbitrar al matricei:
void SomeFunction ()
{
int aNumere = {1, 2, 3};
ArrayFunction (aNumbers); // întreaga matrice
ArrayFunction (& aNumbers [1]); // începând de la al doilea element
}
Această metodă implică, de obicei, trecerea numărului de elemente disponibile într-un parametru suplimentar sau utilizarea unui terminator de matrice.
Pasul 4
Transmiteți datele către o funcție cu un parametru care este un obiect sau o referință la un obiect al clasei care implementează funcționalitatea matricei. Astfel de clase sau șabloane de clasă se găsesc de obicei în biblioteci și cadre populare (QVector în Qt, CArray în MFC, std:: vector în STL etc.).
Adesea, aceste clase implementează o strategie implicită de partajare a datelor cu numărarea referințelor, efectuând o copie profundă numai atunci când datele sunt modificate (copiere la scriere). Acest lucru vă permite să minimizați consumul de resurse de calcul, chiar și în cazul trecerii obiectelor matrice prin valoare prin argumentele funcțiilor și metodelor:
void ArrayFunction (QVector oArray)
{
int nItemCount = oArray.count ();
int nItem = oArray [0];
}
void SomeFunction ()
{
QVector oArray (10);
pentru (int i = 0; i