Tableau 2D initialisation du C
Je sais c'est une vieille histoire, mais je veux un petit tableau 2D allouée statiquement dans mon code. Je sais que la façon de le faire est:
static int A[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
C'est très bien et je peux accéder à tous les membres. Cependant j'ai plusieurs problèmes en passant à une fonction, par exemple:
void print_matrix(int **a, int r, int c)
{
int x, y;
for(x = 0; x < r; x++)
{
printf("Row %02d = %#x = ", x, a[x]);
for(y = 0; y < c; y++)
{
printf("%s%d", (0 == y) ? "" : ", ", a[x][y]);
}
printf("\n");
}
}
Tout d'abord, je ne peut pas simplement passer A
à la fonction, j'ai besoin de cast (int **). Depuis char *
est synonyme de char []
, j'ai été un peu surpris. Deuxièmement, il se bloque et quand je vérifie dans le débogueur, au sein de la sous-fonction, a[0]
est signalé comme 1
et pas un pointeur vers un tableau d'entiers.
Je sais qu'il est de compilateur/langage C les arcanes de la magie qui se passe ici. Mais cela est un peu déroutant. Si j'essaie d'initialiser:
static int *A[3] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
Je reçois une tonne de mises en garde. Comment est-ce différent:
static char *S[3] = { "hello", "there", "stackoverflow" };
Indépendamment de la question des arcanes C de la magie, qui de toute façon je n'ai jamais appris malgré plus d'une décennie de la programmation en C :(, je voudrais savoir comment générer mon tableau afin que je puisse passer avec succès comme une int **
sans avoir à passer par toutes les fag des boucles for ou la copie de la allouée statiquement tableau alloué dynamiquement.
Serait la suite des travaux?
int *A0 = { 1, 2 };
int *A1 = { 3, 4 };
int *A2 = { 5, 6 };
int **A = { A0, A1, A2 };
Est-il plus agréable que cette de le faire?
Merci à tous.
P. s. Je sais que dans la vraie vie, nous lisions des valeurs à partir d'une base ou d'un fichier en des tableaux alloués dynamiquement et d'éviter tout ce genre de choses.
OriginalL'auteur AlastairG | 2010-12-10
Vous devez vous connecter pour publier un commentaire.
Un tableau multidimensionnel n'est pas devenu un multi-niveau de pointeur (je ne sais pas le terme exact). Une seule dimension se désintègre. Par exemple:
int [20]
devientint *
;int [20][5]
devientint (*)[5]
(ce qui n'est pasint **
); etc.Si il y a un grand désir d'utiliser les tableaux multidimensionnels (via le
[r][c]
syntaxe), alors vous devez passer les autres limites (qui doivent être des constantes). Si des bornes variables sont nécessaires, je pense que la meilleure option consiste à effectuer l'indice de conversion manuellement (c'est à dire au lieu dea[r][c]
, utiliseza[r*C + c]
).OriginalL'auteur lijie
Je voudrais commencer par la consultation à cette question dans la FAQ C suivie par cette toute la section.
OriginalL'auteur NPE
Proximité avec la dernière section, mais il faut légèrement différentes déclarations. Le résultant d'Une peut être passé comme
int **
à une fonction.Avec cela,
print_matrix(A, 3, 2);
sorties:OriginalL'auteur benmcclelland
Le moyen le plus rapide est de déclarer argument
a
commeint a[][2]
.c'est c, donc
void print_matrix(int a[][2], <etc>)
.OriginalL'auteur Klark
Fixe, mais pas de points pour le simple fait de repérer une faute de frappe.
OriginalL'auteur arsenm