2010-04-05 6 views
2

Je suis en train d'écrire un programme de test simple pour passer des tableaux multidimensionnels. J'ai lutté pour obtenir la signature de la fonction d'appelé.S'il vous plaît aider avec le passage des tableaux multidimensionnels

Le code que j'ai:

void p(int (*s)[100], int n) { ... } 

... 

{ 
    int s1[10][100], s2[10][1000]; 
    p(s1, 100); 
} 

Ce code semble fonctionner, mais pas ce que je voulais. Je veux que la fonction p soit inconsciente si la gamme de valeurs est 100 ou 1000, mais devrait savoir qu'il y a 10 pointeurs (en utilisant la signature de fonction).

En tant que première tentative:

void p(int (*s)[10], int n) // n = # elements in the range of the array 

et comme second:

void p(int **s, int n) // n = # of elements in the range of the array 

Mais en vain puis-je pas à obtenir ce qu'ils fonctionnent correctement. Je ne veux pas coder en dur les 100 ou 1000 dans la signature, mais plutôt la transmettre, en gardant à l'esprit qu'il y aura toujours 10 tableaux.

De toute évidence, je veux éviter d'avoir à déclarer la fonction:

void p(int *s1, int *s2, int *s3, ..., int *s10, int n) 

Pour votre information, je regarde les réponses à a similar question mais encore confus.

Répondre

4

Vous devez transposer vos tableaux pour que cela fonctionne. Déclarer

int s1[100][10]; 
int s2[1000][10]; 

Maintenant, vous pouvez les transmettre à une fonction comme ceci:

void foo(int (*s)[10], int n) { 
    /* various declarations */ 
    for (i = 0; i < n; i++) 
     for (j = 0; j < 10; j++) 
      s[i][j] += 1 
} 

En raison de la façon dont le système de type C fonctionne, un argument de tableau ne peut être « flexible » dans le sens que vous vouloir dans son index le plus à gauche.

+0

Alternativement, 'void p (int s [] [10], int n) ' – outis

+1

@outis: Tout à fait correct. J'ai utilisé 'int (* s) [10]' en partie parce que j'imitais la question originale, et aussi parce que j'ai personnellement tendance à éviter les déclarations argumentées comme 'int s [] [10]' car elles induisent le lecteur en erreur étant passé à la fonction. –

+0

Merci Dale. Cela semble être la bonne méthode pour appliquer ce que je voulais initialement. Le seul problème est la structure transposée qui gêne mon code. Il semble que l'autre réponse qui suggère de construire dynamiquement le tableau multidimensionnel et de passer dans la plage serait plus appropriée et plus claire à comprendre. – snap

2

Vous pouvez également créer un struct pour la matrice et le transmettre à la fonction p

struct Matrix{ 
    int **array; 
    int n; 
    int m; 
}; 


void p(Matrix *k){ 
    length=k->m; 
    width=k->n; 
    firstElement=k->array[0][0]; 
} 
+0

Cette approche fonctionne et est plus générale, car elle permet la flexibilité dans les deux dimensions de la matrice. Cependant, il doit être clair que 'array 'est un tableau unique de pointeurs' n' avec des entiers, chacun d'entre eux pointant vers un tableau de 'm' entiers. Malgré les similitudes syntaxiques, ceci est très différent de la simple déclaration 'int array [N] [M]' pour certaines constantes N et M. –

Questions connexes