web-dev-qa-db-fra.com

C ++ en passant un pointeur de tableau en tant qu'argument de fonction

J'essaie d'utiliser des pointeurs de tableaux à utiliser comme arguments pour une fonction qui génère un tableau.

void generateArray(int *a[],  int *si){
  srand(time(0));
  for (int j=0;j<*si;j++)
       *a[j]=(0+Rand()%9);
} //end generateArray;

int main() {
  const int size=5;
  int a[size];

  generateArray(&a, &size);

  return 0;
} //end main

Mais quand je compile ceci, ce message apparaît:

cannot convert `int (*)[5]' to `int**' for argument `1' to `void generateArray(int**, int*)'
34
Ortharios

Vous compliquez trop les choses - il faut juste que ce soit:

void generateArray(int *a, int si)
{
    for (int j = 0; j < si; j++)
        a[j] = Rand() % 9;
}

int main()
{
    const int size=5;
    int a[size];

    generateArray(a, size);

    return 0;
}

Lorsque vous transmettez un tableau en tant que paramètre à une fonction, il se décompose en un pointeur sur le premier élément du tableau. Il n’ya donc normalement jamais besoin de passer un pointeur sur un tableau.

68
Paul R

int *a[], utilisé comme paramètre de fonction (mais pas dans les déclarations normales), est un pointeur sur un pointeur, pas un pointeur sur un tableau (dans les déclarations normales, il s'agit d'un tableau de pointeurs). Un pointeur sur un tableau ressemble à ceci:

int (*aptr)[N]

N est un entier positif particulier (pas une variable).

Si vous faites de votre fonction un modèle, vous pouvez le faire et vous n'avez même pas besoin de passer la taille du tableau (car il est automatiquement déduit):

template<size_t SZ>
void generateArray(int (*aptr)[SZ])
{
    for (size_t i=0; i<SZ; ++i)
        (*aptr)[i] = Rand() % 9;
}

int main()
{    
    int a[5];    
    generateArray(&a);
}

Vous pouvez également prendre une référence:

template<size_t SZ>
void generateArray(int (&arr)[SZ])
{
    for (size_t i=0; i<SZ; ++i)
        arr[i] = Rand() % 9;
}

int main()
{    
    int a[5];    
    generateArray(a);
}
18
Benjamin Lindley

Vous n'avez pas besoin de prendre un pointeur sur le tableau pour le transmettre à une fonction générant un tableau, car les tableaux sont déjà décomposition en pointeurs lorsque vous les transmettez à des fonctions. Définissez simplement le paramètre int a[], et utilisez-le comme un tableau régulier dans la fonction, les modifications seront apportées au tableau que vous avez transmis.

void generateArray(int a[],  int si) {
    srand(time(0));
    for (int j=0;j<*si;j++)
        a[j]=(0+Rand()%9);
}

int main(){
    const int size=5;
    int a[size];
    generateArray(a, size);
    return 0;
}

En remarque, vous n'avez pas besoin de passer la taille par pointeur, car vous ne la modifiez pas dans la fonction. De plus, ce n'est pas une bonne idée de passer un pointeur de constante à un paramètre qui attend un pointeur de non constant.

6
dasblinkenlight

Je suppose que cela aidera.

Lorsqu'ils sont passés en tant qu'arguments de fonctions, les tableaux agissent de la même manière que les pointeurs. Donc, vous n'avez pas besoin de les référencer. Tapez simplement: int x[] ou int x[a]. Les deux manières fonctionneront. Je suppose que c'est la même chose que Konrad Rudolf disait, figuré autant.

0
Crispin