Problème courant du tableau 2D - C - Programmation
Marsh Posté le 16-11-2008 à 20:12:08
Si je me souviens bien, on peut remplacer
tab2D[il][ic] |
par
*(tab2D + il * nbc + ic) |
EDIT : Je me suis trompé, il manque une étoile, c'est :
*(*tab2D + il * nbc + ic) |
Pour l'allocation dynamique, il faut imaginer un arbre plutôt qu'un damier. Cela devrait aider à comprendre, par exemple, que le premier tableau (le tableau des pointeurs de pointeurs, en **) n'a pas besoin d'avoir nbc * nbl éléments, que nbl éléments suffit.
Par ailleurs, il faudrait soigner la présentation, par exemple en ayant des indentations de taille fixe (en préférant utiliser toujours trois ou quatre espaces plutôt que la touche de tabulation qui donne des résultats aléatoires) en ne mettant pas d'espace avant les points virgules et les virgules, mais en mettant toujours un espace après ces deux signes, et en mettant un espace avant et après les signes arithmétiques.
Marsh Posté le 16-11-2008 à 20:20:04
Citation : *(tab2D + il * nbc + ic) |
Marche pas (à ma grande surprise justement !) ... Ce qui marche, c'est ça (avec un tab2D déclaré en statique ou en dynamique avec la 2ème méthode) :
Citation : *(*tab2D + il * nbc + ic) |
Marsh Posté le 17-11-2008 à 09:42:17
On peut aussi faire les choses proprement et alloué des tableaux 2D qui ne nécessitent pas cette gymnastique :
Code :
|
L'accès en en l,c se fait via : tab[l][c].
Les gens intelligents trouveront aussi par eux mêmes comment en modifiant ce code, on peut gérer des tableaux à indices négatifs
Marsh Posté le 17-11-2008 à 10:01:16
Salut,
sherminator+ a écrit : Ceci est un tableau de pointeurs, et non un tableau 2D ? |
Il me semble qu'en C les tableaux dit 2D sont des tableaux de pointeurs.
Pour ton premier exemple d'allocation dynamique, tu crée un tableau à une dimension. En toute logique tu devrais declarer un simple pointeur et non un pointeur sur pointeur. Apres c'est "ton esprit" qui va le découper pour en faire un tableau 2D.
edit pour au dessus:
je croyais que les gens intelligents étaient ceux qui savaient écrire du code propre et commenté!
Marsh Posté le 17-11-2008 à 14:32:34
h0taru a écrit : |
Oui, correction faite. Les gens intelligents m'auraient indiqué la fautes de frappe dans sizeof au lieu de faire genre
Marsh Posté le 17-11-2008 à 15:00:42
h0taru a écrit : Il me semble qu'en C les tableaux dit 2D sont des tableaux de pointeurs. |
Non justement, les tableaux 2D (du genre tab[i][j]) sont un seul bloc de i*j éléments.
Marsh Posté le 18-11-2008 à 20:45:16
matafan a écrit : |
oui mais ce sont également des tableaux de pointeurs même en allocation statique.
tab[i] est bien un pointeur vers le début de la colonne.
Marsh Posté le 19-11-2008 à 10:07:34
sligor a écrit : |
Je trouve que présenter les choses comme tu le fais est un peu trompeur. Oui, tab[i] a bien le type int *, mais la valeur de tab[i] n'est stockée nul part en mémoire. Seul le compilo connait la connait. C'est pour ça qu'on ne peut pas dire ce qu'a dit h0taru, c'est à dire que "les tableaux dit 2D sont des tableaux de pointeurs". Ce n'est pas vrai.
Ce que je veux dire, c'est que quand on fait "int tab[2][2]", tout ce qu'on a en mémoire c'est 4 int consécutifs. Il n'y a pas de pointeur là dedans.
Marsh Posté le 20-11-2008 à 07:51:29
Ca dépend comment on voit les choses, matafan.
Une succession de 4 int est fondamentalement un tableau à 1 dimension. Le C permet d'écrire tab[2][2] mais considérer que c'est de la 2D est selon moi un abus de langage.
Dans le doute, j'vais regarder le K&R dans la journée
Marsh Posté le 16-11-2008 à 15:39:05
Bonjour,
Je galère un peu sur les tableaux 2D... J'ai déjà cherché et trouvé pleins de choses sur google mais je comprend pas tout...
Je dois déclarer un tableau 2D de int dont les dimensions nbl et nbc sont connues :
Allocatation statique
Je voudrais remplacer tab2D[il][ic] par *(tab2D + ...) impossible de trouver les ... qui vont bien.
Allocation dynamique
Maintenant nbl et nbc ne sont connus qu'à l'exécution du programme.
Sachant que je veux pourvoir utiliser un adressage type tab2D[il][ic] et *(tab2D + ...), comment déclarer l'alloc ?
=> Marche pas...
=> Ceci est un tableau de pointeurs, et non un tableau 2D ?
Merci d'avance pour votre aide