tableau à 2 dimensions et pointeur

tableau à 2 dimensions et pointeur - C - Programmation

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 ? :??:

Reply

Marsh Posté le 23-10-2005 à 12:07:41   

Reply

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 :(

Reply

Marsh Posté le 23-10-2005 à 15:10:55    

par ce que pointeur et tableau ne sont pas la même chose.

Reply

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 :)

Message cité 1 fois
Message édité par souliane le 23-10-2005 à 15:56:18
Reply

Marsh Posté le 23-10-2005 à 15:50:16    

parce que c'est justement la meme chose.

Reply

Marsh Posté le 23-10-2005 à 15:55:12    

Hein :lol: 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...

Reply

Marsh Posté le 23-10-2005 à 16:26:11    

souliane a écrit :

Hein :lol: 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...


 
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"
char tab2[][9]=
{"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}


Là, c'est correct.
 
En revanche, la déclaration

char tab2[][]=
{"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}


Ne compilera pas parce que le compilo a trop d'inconnues.
 

souliane a écrit :


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.


 
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.


Message édité par Sve@r le 23-10-2005 à 16:28:34

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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!!
 
 


---------------
Hihi j'suis là ou pas?
Reply

Marsh Posté le 23-10-2005 à 16:39:24    

Dsl sve@r tu tape plus vite que moi!!


---------------
Hihi j'suis là ou pas?
Reply

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.

Reply

Marsh Posté le 23-10-2005 à 16:53:45   

Reply

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.
 

Reply

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]
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-10-2005 à 14:45:01    

Anormal13 a écrit :


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


Bien. Enfin un explication claire et juste. C'est rare...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 26-10-2005 à 14:59:20    

tu penses quoi de cette formulation
 

Citation :

un tableau t est :
- une collection de taille statique N d'éléments de même type T
- ces éléments sont contigus en mémoire. Les adresses des éléments sont ordonnées dans l'ordre croissant.
- sizeof t == sizeof(T) * N
- chaque élément de t est accessible directement (en temps constant) par l'opérateur []. les éléments sont indicés sur [0; N[
- un tableau n'est pas un pointeur. la conversion est assurée de telle manière que t -> &t[0]
- ce n'est pas une l-value
- chaque couple (T, N) construit un nouveau type de tableau.

Reply

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...


Message édité par Emmanuel Delahaye le 26-10-2005 à 15:20:49

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 28-10-2005 à 18:19:47    

Merci :)

Reply

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;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed