Les tableaux sont l'une des formes de stockage de données structurées les plus utilisées dans les programmes informatiques. Leur traitement peut être effectué par divers algorithmes implémentés dans des méthodes et fonctions de classe. En conséquence, il est souvent nécessaire de passer un tableau à une fonction. Les langages C et C++ offrent une grande liberté dans le choix des méthodes pour effectuer cette action.
Il est nécessaire
compilateurs de langages C et C++
Instructions
Étape 1
Passez un tableau de taille fixe à la fonction. Modifiez le prototype de la fonction pour qu'il contienne un argument du type approprié. Par exemple, la déclaration d'une fonction qui prend en paramètre un tableau de valeurs numériques entières de trois éléments pourrait ressembler à ceci:
void ArrayFunction (int aNumbers [3]);
Une telle fonction est appelée en lui passant directement un tableau en argument:
void SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (unNumbers);
}
Les données transférées sont copiées sur la pile. La modification du tableau dans la fonction appelée ne change pas la source.
Étape 2
Passez des tableaux de longueur variable à la fonction. Pour cela, il suffit de ne pas préciser la dimension de l'argument correspondant:
void ArrayFunction (int aNumbers );
Les tableaux multidimensionnels peuvent également être transmis de la même manière (seule la première "dimension" peut être des variables):
void ArrayFunction (int aNumbers [3] [2]);
Ces fonctions sont appelées de la même manière que dans la première étape.
Afin de pouvoir traiter correctement des tableaux de longueur variable dans une fonction, vous devez soit passer explicitement le nombre de leurs éléments via un paramètre supplémentaire, soit utiliser des conventions qui imposent des restrictions sur les valeurs des éléments eux-mêmes (une certaine valeur doit être un signe de la fin du tableau).
Étape 3
Passer le tableau par pointeur. L'argument de la fonction doit être un pointeur vers une valeur avec un type correspondant aux éléments du tableau. Par example:
void ArrayFunction (int * pNumbers);
L'accès aux données d'une fonction peut être effectué à la fois dans la notation pour travailler avec des éléments de tableau et en utilisant l'arithmétique d'adresse:
void ArrayFunction (int * pNumbers)
{
pNombres [0] = 10; // accès à l'élément 0
* (pNombres + 1) = 20; // accès à l'élément 1
}
Fais attention! Étant donné que la fonction ne reçoit pas une copie des données, mais un pointeur vers celles-ci, le tableau d'origine sera modifié.
L'avantage de cette méthode est la rapidité, l'économie des ressources de calcul et une certaine flexibilité. Ainsi, vous pouvez appeler la fonction cible en lui passant un pointeur vers un élément arbitraire du tableau:
void SomeFunction ()
{
int aNumbers = {1, 2, 3};
ArrayFunction (unNumbers); // tableau entier
ArrayFunction (& aNumbers [1]); // à partir du deuxième élément
}
Cette méthode implique également généralement de passer le nombre d'éléments disponibles dans un paramètre supplémentaire ou d'utiliser un terminateur de tableau.
Étape 4
Transmettez des données à une fonction avec un paramètre qui est un objet ou une référence à un objet de la classe qui implémente la fonctionnalité de tableau. De telles classes ou modèles de classes se trouvent généralement dans des bibliothèques et des frameworks populaires (QVector dans Qt, CArray dans MFC, std:: vector dans STL, etc.).
Souvent, ces classes implémentent une stratégie de partage de données implicite avec comptage de références, effectuant une copie profonde uniquement lorsque les données sont modifiées (copie sur écriture). Cela permet de minimiser la consommation de ressources de calcul même en cas de passage d'objets tableau par valeur via les arguments des fonctions et méthodes:
void ArrayFunction (QVector oArray)
{
int nItemCount = oArray.count ();
int nItem = oArray [0];
}
void SomeFunction ()
{
QVector oArray (10);
pour (int i = 0; i