Pointeur et tableau

Pointeur et tableau - C++ - Programmation

Marsh Posté le 17-05-2006 à 11:26:13    

Bonjour,
 
Voici le code de ma fonction:
 

Code :
  1. void fct(int *tab){
  2.   tab++;
  3.   printf("%d", *tab);
  4. }

 

Et voici mon tableau:
int tab[2][2] = {{1,2},{3,4}};
 
Pour appeler ma fonction j'utilise : fct(tab); et j'ai le droit à une erreur à la compilation...alors que si je met fct(tab[0]);, je n'ait pas d'erreur : pourquoi ?
 
Merci...

Reply

Marsh Posté le 17-05-2006 à 11:26:13   

Reply

Marsh Posté le 17-05-2006 à 11:34:46    

int *tab est un pointeur sur int
 
int tab[2][2] est un tableau d'in a deux dimensions
 
int *tab est juste un pointeur: ça ne permet pas de transporter les caractéristiques d'un tableau.


Message édité par bjone le 17-05-2006 à 11:34:58
Reply

Marsh Posté le 17-05-2006 à 11:35:01    

C'est normal, ton tableau a deux dimensions, c'est donc l'équivalent d'un int **, et non pas d'un int*
 
Donc, tab[0], c'est la premiere ligne de ton tableau, soit un int tab[2], qui est l'équivalent d'un int *, donc ca marche.


Message édité par durkheim le 17-05-2006 à 11:37:27
Reply

Marsh Posté le 17-05-2006 à 11:36:16    

La réponse est simple,
 
tab[2][2] équivaut à un tableau **tab (pointeur de pointeur)
lorsque tu transmet tab[0] tu donne comme paramètre *tab (en gros, c'est la valeur désignée par le pointeur de pointeur donc cette valeur est un pointeur), ce qui correspond à la définition de ta fonction.
 
Suis-je clair?


---------------
Dans la vie le meilleur chemin n'est pas forcément le plus droit mais celui sur lequel on se sent le plus à l'aise
Reply

Marsh Posté le 17-05-2006 à 11:36:25    

non plus.
 
int ** est un pointeur sur pointeur de int.
 
---
 
edit: oui en fait suivant comment on se place.


Message édité par bjone le 17-05-2006 à 11:37:13
Reply

Marsh Posté le 17-05-2006 à 11:38:21    

en fait ça explique pourquoi avec fct(tab[0]) ça marche, mais c'est pas ce qu'il veut je pense.


Message édité par bjone le 17-05-2006 à 13:18:35
Reply

Marsh Posté le 17-05-2006 à 11:50:24    

boost::array ou boost::multi_array ou meme
 

Code :
  1. template <std::size_t L, std::size_t C>
  2. void fct(int (&tab)[L][C])
  3. {
  4. }


 
 
Durkheim & gwenCPP > vous avez plus qu'a revoir ce qu'est un tableau, en c++ un tableau multidimensionnel est un tableau de tableau, ca implique que les donnees sont contigues et l'adresse de ce genre de tableau n'est pas typée 'int **' dans le cas d'un tableau 2d mais 'int (*)[N]'

Reply

Marsh Posté le 17-05-2006 à 12:09:34    

pourquoi ne pas utiliser les vector ? et les vector de paires ? les tableaux saÿ mal :o


---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 17-05-2006 à 12:14:29    

la taille est connue à la compilation, mais bon, le vrai probleme c'est que les tableaux multidimensionnelles avec std::vector c'est une syntaxe lourde et les données sont fragmentées

Reply

Marsh Posté le 17-05-2006 à 12:15:29    

skelter a écrit :

la taille est connue à la compilation, mais bon, le vrai probleme c'est que les tableaux multidimensionnelles avec std::vector c'est une syntaxe lourde et les données sont fragmentées


 
syntaxe lourde a moins de connaitre la bidouille pour les typedef (expliquée dans developpez.com)


---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 17-05-2006 à 12:15:29   

Reply

Marsh Posté le 17-05-2006 à 12:21:59    

tu peux toujours alleger une syntaxe avec un typedef, ca c'est une regle generale, mais ca n'empeche rien au fait que std::vector n'est pas une bonne solution pour les tableaux multi dimensionnels, regardes boost::multi_array

Reply

Marsh Posté le 17-05-2006 à 12:23:19    

enfin c'est au moins une solution standard

Reply

Marsh Posté le 21-05-2008 à 21:24:27    

casafa a écrit :

Bonjour,
 
Voici le code de ma fonction:
 

Code :
  1. void fct(int *tab){
  2.   tab++;
  3.   printf("%d", *tab);
  4. }


 
Et voici mon tableau:
int tab[2][2] = {{1,2},{3,4}};
 
Pour appeler ma fonction j'utilise : fct(tab); et j'ai le droit à une erreur à la compilation...alors que si je met fct(tab[0]);, je n'ait pas d'erreur : pourquoi ?
 
Merci...


 
10 000 ans plus tard...
La réponse est ultra simple. Cela n'a rien avoir avec les dimensions!!! En fait quand tu passes fct(tab) tu passes un pointeur CONSTANT sur tab[0]. Mais dans ton code tu fais tab++. C'est impossible de modifier tab puisqu'il est constant. Ca marcherait,  tu créais un variable pointeur vers ton tableau dans ta fonction:  

Code :
  1. void fct(int *tab){
  2. tab++;
  3. int * tab_ptr = &tab;
  4. tab_ptr++;
  5. printf("%d", *tab);
  6. }


Salut

Reply

Marsh Posté le 21-05-2008 à 21:25:14    

casafa a écrit :

Bonjour,
 
Voici le code de ma fonction:
 

Code :
  1. void fct(int *tab){
  2.   tab++;
  3.   printf("%d", *tab);
  4. }


 
Et voici mon tableau:
int tab[2][2] = {{1,2},{3,4}};
 
Pour appeler ma fonction j'utilise : fct(tab); et j'ai le droit à une erreur à la compilation...alors que si je met fct(tab[0]);, je n'ait pas d'erreur : pourquoi ?
 
Merci...


 
10 000 ans plus tard...
La réponse est ultra simple. Cela n'a rien avoir avec les dimensions!!! En fait quand tu passes fct(tab) tu passes un pointeur CONSTANT sur tab[0]. Mais dans ton code tu fais tab++. C'est impossible de modifier tab puisqu'il est constant. Ca marcherait,  tu créais un variable pointeur vers ton tableau dans ta fonction:  

Code :
  1. void fct(int *tab){
  2. int * tab_ptr = &tab;
  3. tab_ptr++;
  4. printf("%d", *tab);
  5. }


Salut

Reply

Marsh Posté le 22-05-2008 à 12:51:43    

cte remontage de post ... [:mlc2]


---------------
Atari 520 ST 256 Ko
Reply

Marsh Posté le 22-05-2008 à 13:19:06    

c'est une pelle d'argent je pense.

Reply

Marsh Posté le 22-05-2008 à 14:38:21    

http://www.izipik.com/images/20080522/lukdqpjx9p9miy4d1x-deterrage.png

Reply

Marsh Posté le 22-05-2008 à 14:42:52    

si on pouvait arrêter le deterrage de truc C. Hier déjà y en a eu, c'est lourd.

Reply

Sujets relatifs:

Leave a Replay

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