Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
650 connectés 

  FORUM HardWare.fr
  Programmation
  C

  tableau à 2 dimensions et pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tableau à 2 dimensions et pointeur

n°1228974
souliane
Posté le 23-10-2005 à 12:07:41  profilanswer
 

Pourquoi si je fais ça :
 
char tab1[X][Y];
char ** tab2;
 
tab2 = tab1;
 
le compilo me balance un warning sur l'affectation de tab2 ? :??:

mood
Publicité
Posté le 23-10-2005 à 12:07:41  profilanswer
 

n°1228981
souliane
Posté le 23-10-2005 à 12:37:26  profilanswer
 

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

n°1229024
Taz
bisounours-codeur
Posté le 23-10-2005 à 15:10:55  profilanswer
 

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

n°1229025
souliane
Posté le 23-10-2005 à 15:17:04  profilanswer
 

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
n°1229036
Taz
bisounours-codeur
Posté le 23-10-2005 à 15:50:16  profilanswer
 

parce que c'est justement la meme chose.

n°1229040
souliane
Posté le 23-10-2005 à 15:55:12  profilanswer
 

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

n°1229047
Sve@r
Posté le 23-10-2005 à 16:26:11  profilanswer
 

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.
n°1229053
Anormal13
Posté le 23-10-2005 à 16:38:02  profilanswer
 

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?
n°1229055
Anormal13
Posté le 23-10-2005 à 16:39:24  profilanswer
 

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


---------------
Hihi j'suis là ou pas?
n°1229066
souliane
Posté le 23-10-2005 à 16:53:45  profilanswer
 

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.

mood
Publicité
Posté le 23-10-2005 à 16:53:45  profilanswer
 

n°1229095
Taz
bisounours-codeur
Posté le 23-10-2005 à 18:05:56  profilanswer
 

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.
 

n°1231546
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2005 à 14:42:07  profilanswer
 

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/
n°1231550
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2005 à 14:45:01  profilanswer
 

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/
n°1231577
Taz
bisounours-codeur
Posté le 26-10-2005 à 14:59:20  profilanswer
 

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.

n°1231590
Emmanuel D​elahaye
C is a sharp tool
Posté le 26-10-2005 à 15:20:21  profilanswer
 

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/
n°1233786
souliane
Posté le 28-10-2005 à 18:19:47  profilanswer
 

Merci :)

n°1234554
leneuf22
Posté le 30-10-2005 à 18:45:50  profilanswer
 

Par contre, tu peux très bien faire ceci :
 
char tab1[X][Y];  
char (*tab2)[Y];  
tab2 = tab1;


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  tableau à 2 dimensions et pointeur

 

Sujets relatifs
[CSS] Tableaudetecter une dimension d'un tableau [Trouvé]
Créer un tableau un peu particulierTableau associatif trois dimensions...
Tableau qui s'affiche de manière incomplète[TABLE/CSS] Tableau avec ascenseur !
tableau htmlVariable PHP fait exploser un tableau :(
delete[] & tableau de pointeurs 
Plus de sujets relatifs à : tableau à 2 dimensions et pointeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR