Demande d'explication sur des passages de tableaux à 2 dimensions... - C - Programmation
Marsh Posté le 30-07-2003 à 16:48:40
char tab[4][5] est de type char* pas char **
si tuveux passer un tableau à une fonction c:
Code :
|
Marsh Posté le 30-07-2003 à 16:57:55
Mais c'est pourtant un tableau à deux dimensions!
Et ça m'oblige à avoir deux fonctions différentes, l'une acceptant char** pour les tableaux à 2D construits avec malloc, et l'autre acceptant les char* pour les tableaux à 2D du type tab[][].
Comment je fais pour n'avoir qu'une seule fonction qui accepterait n'importe lequel des deux types???
Marsh Posté le 30-07-2003 à 17:05:24
je me souviens, je t'explique
en fait un tableau a deux dimensions est un tableau a une dimension.
exemple :
tab[3] -> elem0 elem1 elem2
tab[3][2] -> elem00 elem01 ele10 elem11 elem20 elem 21
si tu veux l'adresse de l'element tab [2][0] du tableau tab[i][j], c'est en fait l'adresse de tab[0][0] + 2*j*sizeof(elem)
j'espere que l'explication est claire
Marsh Posté le 30-07-2003 à 17:54:54
torpe23 a écrit : Mais c'est pourtant un tableau à deux dimensions! |
Un tableau de char quelque soit sa dimension et son type d'allocation est tjrs un char *:
Code :
|
Marsh Posté le 30-07-2003 à 17:56:51
pas du tout. le seul point commun c'est que tous les éléments sont contigus et que ton compilo est capable de faire les calculs d'index pour un tableau.|
Marsh Posté le 30-07-2003 à 19:17:50
Taz a écrit : pas du tout. le seul point commun c'est que tous les éléments sont contigus et que ton compilo est capable de faire les calculs d'index pour un tableau.| |
Alors attend tu me la refait là, c quoi la différence entre deux char l'un à côté de l'autre en mémore et ... deux char l'un à côté de l'autre an mémoire?
tab[i][j] c'est une autre écriture pour tab[i*s+j] (où s est la taille d'une ligne) c tout
EDIT je me suis un peu avancé dans mon exemple y en a un qui est alloué sur la pile et pas l'autre mais bon.
Marsh Posté le 30-07-2003 à 19:24:53
1) t'as fait un edit
2) commence pas à casser mon boulot tableau!=pointeur
je suis d'accord c'est proche... tu dis que c'est la meme chose, les gens comprennent rien, demain, on va tomber sur un type qui va nous faire de l'affectation entre tableaux et pointeurs
je te conseille de lire fclc et le K&R, y a plein de détails sur tout ça (dans les annexes aussi)
Marsh Posté le 30-07-2003 à 19:32:30
Taz a écrit : 1) t'as fait un edit |
Effectivement j'ai fait un edit par ce que j'ai vu ma connerie (que j'ai signalée d'ailleur)
Je t'accorde que j'ai pas été très pédaguogue sur coup. En même temps tu déclare pas de tableau en C tu déclare un pointeur vers un emplacement mémoire qui se trouve être une suite de structure de donnée placée de façon contigüe (le dit tableau quoi).
J'essairai d'être plus clair la prochaine fois.
Marsh Posté le 30-07-2003 à 19:36:38
oui mais ça fait une sacré différence, au niveau du sizeof, au niveau de l'arithmétique, au niveau de l'initialisation
malloc(n*m) ça ne permet pas la meme utilisation que [m][n] pour ne citer que ça
Marsh Posté le 30-07-2003 à 19:43:17
Taz a écrit : oui mais ça fait une sacré différence, au niveau du sizeof, au niveau de l'arithmétique, au niveau de l'initialisation |
c pour ça que j'utilise jamais [m][n], c trop chiant
Marsh Posté le 30-07-2003 à 16:39:32
Je pense que tout le monde est déja passé par ce problème: passer un tableau à deux dimensions comme paramètre d'une fonction!
Je vous balance le code que j'ai pondu:
Maintenant, je veux bien qu'on m'explique pkoi il y a une différence entre tab[][] et **tab !!! (si vous avez la flemme de compiler, voici ce que me sort le compilateur:
essai.c:20: warning: passing arg 1 of `parcours' from incompatible pointer type
-> c'est pour le 2ème appel de "parcours" )
Merci d'avance!
Message édité par torpe23 le 30-07-2003 à 16:40:42