Gli array sono una delle forme più utilizzate di archiviazione di dati strutturati nei programmi per computer. La loro elaborazione può essere eseguita da vari algoritmi implementati in metodi e funzioni di classe. Di conseguenza, è spesso necessario passare un array a una funzione. I linguaggi C e C++ offrono grande libertà nella scelta delle modalità di esecuzione di questa azione.
È necessario
compilatori di linguaggi C e C++
Istruzioni
Passo 1
Passa un array di dimensioni fisse alla funzione. Modificare il prototipo della funzione per contenere un argomento del tipo appropriato. Ad esempio, la dichiarazione di una funzione che accetta un array di valori numerici interi di tre elementi come parametro potrebbe avere il seguente aspetto:
void ArrayFunction (int aNumbers [3]);
Tale funzione viene chiamata passando un array direttamente ad essa come argomento:
void SomeFunction ()
{
int aNumeri = {1, 2, 3};
ArrayFunction (aNumbers);
}
I dati trasferiti vengono copiati nello stack. La modifica dell'array nella funzione chiamata non cambia l'origine.
Passo 2
Passa array di lunghezza variabile alla funzione. Per fare ciò, semplicemente non specificare la dimensione dell'argomento corrispondente:
void ArrayFunction (int aNumbers );
Anche gli array multidimensionali possono essere passati in modo simile (solo la prima "dimensione" può essere variabile):
void ArrayFunction (int aNumbers [3] [2]);
Queste funzioni vengono chiamate allo stesso modo del primo passaggio.
Per poter elaborare correttamente array di lunghezza variabile in una funzione, è necessario passare esplicitamente il numero dei loro elementi attraverso un parametro aggiuntivo o utilizzare convenzioni che impongono restrizioni ai valori degli elementi stessi (un certo valore deve essere un segno della fine dell'array).
Passaggio 3
Passa l'array per puntatore. L'argomento della funzione deve essere un puntatore a un valore con un tipo corrispondente agli elementi dell'array. Per esempio:
void ArrayFunction (int * pNumbers);
L'accesso ai dati in una funzione può essere effettuato sia nella notazione per lavorare con gli elementi dell'array, sia utilizzando l'aritmetica degli indirizzi:
void ArrayFunction (int * pNumbers)
{
pNumeri [0] = 10; // accesso all'elemento 0
* (pNumeri + 1) = 20; // accesso all'elemento 1
}
Stai attento! Poiché alla funzione non viene passata una copia dei dati, ma un puntatore ad essa, l'array originale verrà modificato.
Il vantaggio di questo metodo è la velocità, l'economia delle risorse computazionali e una certa flessibilità. Quindi, puoi chiamare la funzione target passandole un puntatore a un elemento arbitrario dell'array:
void SomeFunction ()
{
int aNumeri = {1, 2, 3};
ArrayFunction (aNumbers); // intero array
ArrayFunction (& aNumeri [1]); // a partire dal secondo elemento
}
Questo metodo di solito comporta anche il passaggio del numero di elementi disponibili in un parametro aggiuntivo o l'utilizzo di un terminatore di array.
Passaggio 4
Passa i dati a una funzione con un parametro che è un oggetto o un riferimento a un oggetto della classe che implementa la funzionalità dell'array. Tali classi o modelli di classe si trovano solitamente nelle librerie e nei framework più diffusi (QVector in Qt, CArray in MFC, std:: vector in STL, ecc.).
Spesso queste classi implementano una strategia di condivisione dati implicita con conteggio dei riferimenti, eseguendo una copia profonda solo quando i dati vengono modificati (copia in scrittura). Ciò consente di ridurre al minimo il consumo di risorse computazionali anche nel caso di passaggio di oggetti array per valore tramite gli argomenti di funzioni e metodi:
void ArrayFunction (QVector oArray)
{
int nItemCount = oArray.count ();
int nItem = oArray [0];
}
void SomeFunction ()
{
QVector oArray (10);
per (int i = 0; i