tableau à 2 dimensions et pointeur - C - Programmation
Marsh Posté le 23-10-2005 à 12:37:26
En plus de balancer un warning ca me merde carrément tout. En fait j'ai dans un programme une déclaration du style :
char tab[X][Y]
ou X et Y sont des constantes. Et pour passer le tableau à une fonction je déclarait le paramètre avec "char ** tab" au lieu de "char tab[X][Y]". Eh ben ça me fouttait un SEG_FAULT.
Je comprend pas ça
Marsh Posté le 23-10-2005 à 15:10:55
par ce que pointeur et tableau ne sont pas la même chose.
Marsh Posté le 23-10-2005 à 15:17:04
ben oui mais l'identifiant qui représente un tableau c'est bien un pointeur... et d'ailleur lorsqu'il s'agit de tableau à une dimension il n'y a aucun probleme à faire :
char tab1[X];
char * tab2 = tab1;
Alors pourquoi là ça déraille ?
Edit : le "là" fait référence au tableau deux dimensions, pas à l'exemple à 1 dimension
Marsh Posté le 23-10-2005 à 15:55:12
Hein un coup tu me dis que c'est la même chose et l'autre coup non. Je suis largué !
Lorsque le tableau n'a que une dimension c'est la même chose, mais lorsqu'il a deux dimensions c'est pas pareil, c'est ça que tu veux me dire ?
Je vois bien qu'il y a un truc genant avec le tableau a deux dimensions, car les différents tab[i] ne sont pas forcément contigue en mémoire (si ?), c'est seulement leur adresse qui sont rangées de manière contigue. Mais après je n'arrive pas à aller plus loin...
Marsh Posté le 23-10-2005 à 16:26:11
souliane a écrit : Hein un coup tu me dis que c'est la même chose et l'autre coup non. Je suis largué ! |
Dans le cas d'un tableau à une dimension, le compilo n'a aucun soucis.
Que tu aies déclaré ton tableau "char *tab" ou "char tab[]"; il saura toujours récupérer l'info "tab[i]" car il lui suffira de décaler de "i * sizeof(char)"
Dans le cas d'un tableau à 2 (ou "n" ) dimensions, cela ne va plus. Pour que le compilo puisse accéder à l'info "tab[i][j]", il faut qu'il décale d'abord de "i" lignes puis "j" colonnes. Cela impose qu'il connaisse la taille d'une ligne.
C'est un peu la même chose que dans la déclaration suivante
char tab1[]="Hello" |
Là, c'est correct.
En revanche, la déclaration
char tab2[][]= |
Ne compilera pas parce que le compilo a trop d'inconnues.
souliane a écrit : |
Ta fonction peut s'en sortir avec "char tab[x][y]" ou "char *tab[y]" mais ne pourra pas travailler avec un "char **tab" => SEG_FAULT
Dans un tableau, seule la dernière dimension peut être omise et remplacée par une étoile. Au delà, il faut passer par des pointeurs intermédiaires.
Marsh Posté le 23-10-2005 à 16:38:02
Le type attendu n'est pas le bon pour les pointeurs a 2 dimensions!
Petit code pour expliquer :
int t[10], i;
for(i=0; i<10; i++)
t[i] = 1;
est équivalent à :
int t[10] , i;
int *ptr;
for(ptr=t, i=0; i<10; i++, ptr++)
*ptr = 1;
Remarque : le symbole t représente un pointeur constant vers le premier élémént du tableau!Le type est bien le meme que le pointeur ptr
tu n'as pas d'erreur de compilation, alors que dans le cas où le tableau aurais plusieurs dimensions, par exemple int t[3][4] :
La aussi le symbole t est converti en un pointeur vers le premier élément du tableau (&t[0]) mais en revanche le symbole t est encore converti en un pointeur vers des tableaux de 4 éléments de type int et non un pointeur de type int!
C'est pourquoi tu as une erreur de compilation le type attendu n'est pas le bon!!!
Autre chose tu ne devrais pas oublier de reserver de la mémoire pour les pointeurs!
22 v'la l'Anormal!!
Marsh Posté le 23-10-2005 à 16:39:24
Dsl sve@r tu tape plus vite que moi!!
Marsh Posté le 23-10-2005 à 16:53:45
Merci beaucoup pour vos explications. Et concernant le
int main(int argc, char * argv[])
vs
int main(int argc, char ** argv)
Il semble que la première version soit la plus utilisée, pourquoi ? Est ce pour prendre l'habitude de ne pas avoir trop d'étoile ? Car à l'utilisation il semble que ce soit équivalent.
Marsh Posté le 23-10-2005 à 18:05:56
voir le topic sur les tableau.
T x[] et T *x c'est la même chose. On utilise [] parce que ça fait plus "tableau"-like.
Marsh Posté le 26-10-2005 à 14:42:07
souliane a écrit : ben oui mais l'identifiant qui représente un tableau c'est bien un pointeur |
Non, c'est l'adresse du premier élément du tabeau et c'est une constante. On appelle ça aussi un pointeur constant, mais certainement pas un 'pointeur' tout court.
soit
T a[SIZE];
a == a+0 == &a[0]
Marsh Posté le 26-10-2005 à 14:45:01
Anormal13 a écrit :
|
Bien. Enfin un explication claire et juste. C'est rare...
Marsh Posté le 26-10-2005 à 14:59:20
tu penses quoi de cette formulation
Citation : un tableau t est : |
Marsh Posté le 26-10-2005 à 15:20:21
Taz a écrit : tu penses quoi de cette formulation |
Ca me va. On peut aussi dire que le nom du tableau est une adresse ou un pointeur constant...
On peut aussi expliquer ce qu'est une l-value...
Marsh Posté le 30-10-2005 à 18:45:50
Par contre, tu peux très bien faire ceci :
char tab1[X][Y];
char (*tab2)[Y];
tab2 = tab1;
Marsh Posté le 23-10-2005 à 12:07:41
Pourquoi si je fais ça :
char tab1[X][Y];
char ** tab2;
tab2 = tab1;
le compilo me balance un warning sur l'affectation de tab2 ?