C: Fonction de permuter les valeurs dans le tableau 2D
Je suis en train d'écrire une fonction pour permuter les 2 éléments dans un tableau 2D:
void swap(int surface[][], int x1, int y1, int x2, int y2) {
int temp = surface[x1][y1];
surface[x1][y1] = surface[x2][y2];
surface[x2][y2] = temp;
}
cependant, lorsque j'essaie de le compiler (gcc), j'obtiens ce message d'erreur:
Sim_Annealing.c: In function `swap':
Sim_Annealing.c:7: error: invalid use of array with unspecified bounds
Sim_Annealing.c:8: error: invalid use of array with unspecified bounds
Sim_Annealing.c:8: error: invalid use of array with unspecified bounds
Sim_Annealing.c:9: error: invalid use of array with unspecified bounds
Est-il quelque chose de magique que j'ai à faire afin d'avoir un tableau 2D comme paramètre d'une fonction?
Merci pour votre aide. Si vous connaissez des bonnes références pour les tableaux comme paramètres de la fonction envoyer à ma façon 🙂
- S'il vous plaît poster un commentaire lorsque vous votez à près pour "copie exacte" en disant que c'est une copie exacte de.
- Vous pouvez voir une liste de doublons en cliquant sur "fermer" puis de voter "copie exacte". Dans ce cas, la personne qui pose cette question: stackoverflow.com/questions/4051/...
- Les utilisateurs qui n'ont pas assez de rep à voter pour fermer ne parvenez pas à visualiser le projet de double de cette façon, cependant. Dans beaucoup de cas, qui va inclure la personne qui a posé la question à l'origine.
- Vous pouvez toujours voter pour fermer vos propres questions, peu importe la réputation. Donc vous pouvez voir la proximité des motifs sur vos propres questions avant de elle est fermée.
- Ok, j'ai ajouté un exemple d'utilisation de l'complètement généralisée de longueur variable de la matrice de paramètres qui ont été introduites avec le C99. Attention, C99 n'a pas été largement pris en charge au début et à la plupart des implémentations ne sont pas encore complètement conforme.
Vous devez vous connecter pour publier un commentaire.
Il suffit de déclarer le tableau de paramètres. Mieux encore, utiliser un typedef pour la déclaration initiale et de la fonction du paramètre formel.
Le problème est que sans le savoir la taille de la ligne, c'est à dire, le nombre de colonnes, il n'a aucun moyen de calculer le pointeur de réglage pour obtenir les lignes suivantes. Fait intéressant, il n'a pas besoin de connaître le nombre de lignes que vous avez.
Par exemple, cela fonctionne:
Mais il serait mieux d'attacher de l'appelant types et la fonction de type de l'ensemble.
Chaque indice d'accès nécessitera une multiplication, mais cela fonctionne (seulement C99-conforme aux compilateurs) ...
Un autre exemple, qui serait dans le même pré-C89 environnements:
Et enfin, parce que la longueur variable des tableaux sont quelque chose d'assez récent, le traditionnel et toujours le plus rapide de la technique est de passer
int *a[]
. Cela ne nécessite pas une connaissance quelconque de la ligne ou de la colonne longueurs, mais vous avez besoin pour construire le pointeur de vecteur.std::vector
.Si le tableau est un "vrai" tableau 2D, vous devez spécifier la taille de tous, mais la première dimension:
Il y a quelques problèmes avec cela. Si votre 2D tableaux sont vraiment des tableaux de pointeurs (
int *surface[]
), qui ne fonctionne pas, et vous avez besoin de changer lasurface
paramètre un pointeur vers un pointeur:Ou, pour rendre la fonction plus générale, vous pouvez le changer pour accepter deux pointeurs int (qui pourrait pointer n'importe où) et les échanger:
et vous l'appeler comme ceci:
En C seule la première dimension du tableau est autorisé à rester indéterminée, parce qu'il a besoin de savoir comment calculer les décalages. Si vous avez besoin de travailler avec une taille variable tableau 2D passe dans notre tableau comme un int*, passez à la taille de votre deuxième dimensions et le pointeur de mathématiques de vous-même:
C'est la même chose que le [][] syntaxe est en train de faire, comme les tableaux en C sont vraiment juste des pointeurs.
GCC permet de varier la longueur des tableaux comme arguments de fonctions:
Passant tableaux multidimensionnels comme arguments de la fonction présente des maux de tête. Rappelez-vous que dans la plupart des contextes, une expression de type tableau sera implicitement converti en un type pointeur, et sa valeur est l'adresse du premier élément du tableau. Ainsi, par exemple, un 10x20 tableau de int est converti en pointeur vers un 20-élément de tableau de int:
C'est là un grand problème s'affiche. Basé sur son prototype, swap() ne peut traiter que Nx20 des tableaux de int; le nombre de lignes peut varier, mais le nombre de colonnes ne peuvent pas, parce que
T (*)[N]
est un autre type deT (*)[M]
où N != M. Idéalement, vous souhaitez une fonction qui permet de traiter un nombre arbitraire de lignes et colonnes. Une façon de faire qui consiste à traiter le tableau comme un tableau 1D de T, et de calculer en ligne et en colonne les décalages manuellement:Ici nous transmettre l'adresse du premier élément (&surface[0][0]) et de la traiter comme un simple pointeur vers int. De cette façon, nous pouvons traiter avec n'importe quel nombre de lignes et de colonnes. Notez que cela ne fonctionne que pour de véritables tableaux 2D (pas de tableaux de pointeurs), puisque swap suppose que les éléments du tableau sont disposés de manière contiguë.