tableau a deux dimension en parametre

tableau a deux dimension en parametre - C++ - Programmation

Marsh Posté le 08-10-2010 à 10:43:43    

plop plop plop,
 
je voudrais passer un tableau a deux dimmensions en parametre et j'obtient une erreur.
 
au debut j'avais mis une * comme pour un unidimensionel, mais apres reflection vu que le tableau a deux dimension ils semblerais logique de mettre deux *, mais j'obtient toujours une erreur de compilation :/
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. void ClcPos(long *Ln, long *Cl);
  4. void ClcPosAlt(long *Ln, long *Cl);
  5. void PrintCarre(long Length, long **Tab);
  6. void InitCarre(long Number, long **Tab);
  7. using namespace std;
  8. int main(void)
  9.     {
  10.     long Tab[11][11]; //ligne colone
  11.     long Ln,Cl,Nb,N;
  12.    
  13.     Nb = 1;
  14.    
  15.     cout << "init du tableau bidimentionel 11x11\n";
  16.     InitCarre(0, Tab);
  17.     cout << "ajoute du 1\n\n";
  18.     Tab[4][5] = Nb;
  19.     PrintCarre(11, Tab); 
  20.    
  21.     for(N=0; N <121 ; N++ )
  22.      
  23.        {
  24.        Nb++;
  25.        cout<<"Nb = "<<Nb<<" \n";
  26.        ClcPos(&Ln, &Cl);
  27.        if(Tab[Ln][Cl] == 0)
  28.           {
  29.           Tab[Ln][Cl] = Nb;
  30.           }
  31.        else
  32.           {
  33.           do{
  34.              ClcPosAlt(&Ln, &Cl);
  35.              }while(Tab[Ln][Cl] == 0);
  36.           Tab[Ln][Cl] = Nb;
  37.           }
  38.        }
  39.      
  40.     cout << "tatata\n\n";
  41.    
  42.     PrintCarre(11, Tab);
  43.    
  44.     system("pause" );
  45.     }
  46.    
  47.     void ClcPos(long *Ln, long *Cl)
  48.          {
  49.          if (*Ln == 0)
  50.             *Ln = 10;
  51.          else
  52.             *Ln--;
  53.        
  54.          if ((*Cl == 10) || (*Cl == 0))
  55.              {
  56.              if (*Cl == 10)
  57.                 {
  58.                 *Cl = 0;
  59.                 }
  60.              else
  61.                 {
  62.                 *Cl = 10;
  63.                 }
  64.              }
  65.          else
  66.              {
  67.              *Cl++;
  68.              }
  69.          }
  70.        
  71.     void ClcPosAlt(long *Ln, long *Cl)
  72.          {
  73.          if (*Ln == 0)
  74.             *Ln = 10;
  75.          else
  76.             *Ln++;
  77.        
  78.          if ((*Cl == 10) || (*Cl == 0))
  79.              {
  80.              if (*Cl == 10)
  81.                 {
  82.                 *Cl = 0;
  83.                 }
  84.              else
  85.                 {
  86.                 *Cl = 10;
  87.                 }
  88.              }
  89.          else
  90.              {
  91.              *Cl--;
  92.              }
  93.          }
  94.        
  95.     //affiche le carré, si le tab a 11 case de 0 a 10 passer 11 en para
  96.     void PrintCarre(long Length, long **Tab)
  97.        {
  98.        long Ln, Cl;
  99.        for(Ln=0; Ln<Length; Ln++)
  100.           {
  101.           for(Cl=0; Cl<Length; Cl++)     
  102.              {   
  103.              cout <<Tab[Ln][Cl]<<" ";   
  104.              }
  105.           cout<<"\n";
  106.           } 
  107.         cout<<"\n";
  108.         }
  109.    void InitCarre(long Number, long **Tab)
  110.       {
  111.       for(Ln=0; Ln<11; Ln++)
  112.        {
  113.        for(Cl=0; Cl<11; Cl++)     
  114.           {
  115.           Tab[Ln][Cl] = Number;           
  116.           }
  117.        }
  118.       }


 
des idées?
 
merci :)

Reply

Marsh Posté le 08-10-2010 à 10:43:43   

Reply

Marsh Posté le 08-10-2010 à 11:56:28    

pourquoi est-ce qsue ton prototype attend deux pointeurs alors que tu passes un entier et un tableau ? Ca ne te choque pas ?
 
Un tableau à deux dimensions n'est en fait qu'une zone mémoire de Lignes*Colonnes éléments. Tu as donc besoin d'un seul pointeur. Transmettre les dimensions reste à ta charge.
 
Cela dit, on est en C++, les tableaux, on ne s'en sert presque jamais. Utilise plutôt des vector< vector< long > >, tu te simplifieras la vie


---------------
last.fm
Reply

Marsh Posté le 08-10-2010 à 13:05:48    

c'est du C++ ecole, je suis obligé d'utiliser des tableau, c'est l'enoncé
 
apres mon code marche, j'ai juste voulu le rendre plus beau en fractionnant le code en fonction, et PAF^^
 
c'est pas faut, neanmoins je vois pas vraiment comment "transmetre ça"

Reply

Marsh Posté le 08-10-2010 à 13:44:40    

Code :
  1. void blah( int* pTab, size_t largeur, size_t hauteur )
  2. {
  3.   for( size_t i = 0; i < hauteur; ++i )
  4.     for( size_t j = 0; j < largeur; ++j )
  5.       pTab[ i * largeur + j ] = 0;
  6. }
  7. void caller()
  8. {
  9.   static const size_t largeur = 11, hauteur = 13;
  10.   int tab[ largeur ][ hauteur ];
  11.   blah( tab, largeur, hauteur );
  12. }

Message cité 1 fois
Message édité par theshockwave le 08-10-2010 à 13:44:55

---------------
last.fm
Reply

Marsh Posté le 08-10-2010 à 14:25:57    

theshockwave a écrit :

Code :
  1. void blah( int* pTab, size_t largeur, size_t hauteur )
  2. {
  3.   for( size_t i = 0; i < hauteur; ++i )
  4.     for( size_t j = 0; j < largeur; ++j )
  5.       pTab[ i * largeur + j ] = 0;
  6. }
  7. void caller()
  8. {
  9.   static const size_t largeur = 11, hauteur = 13;
  10.   int tab[ largeur ][ hauteur ];
  11.   blah( tab, largeur, hauteur );
  12. }



 
Ca ne doit pas compiler: un pointeur vers un tableau ce n'est pas un pointeur vers le type de base.
En passant un tableau, seule la premiere dimention peut etre variable:
 

Code :
  1. #include <stddef.h>
  2. size_t const nb_cols = 11;
  3. void blah(int pTab[][nb_cols], size_t nb_lignes)
  4. {
  5.     for (size_t i = 0; i < nb_lignes; ++i)
  6.        for (size_t j = 0; j < nb_cols; ++j)
  7.           pTab[i][j] = 0;
  8. }
  9. void caller()
  10. {
  11.   size_t const nb_lignes = 13;
  12.   int tab[nb_lignes][nb_cols];
  13.   blah(tab, nb_lignes);
  14. }


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 08-10-2010 à 16:47:45    

Oui utilise vector.

Reply

Marsh Posté le 08-10-2010 à 21:48:05    

donc ça marche =D
 

Code :
  1. #include <cstdlib>
  2. #include <iostream>
  3. void ClcPos(long *Ln, long *Cl);
  4. void ClcPosAlt(long *Ln, long *Cl);
  5. void PrintCarre(long Length, long Tab[][11]);
  6. void InitCarre(long Number, long Length, long Tab[][11]);
  7. using namespace std;
  8. int main(void)
  9.     {
  10.     long Tab[11][11]; //ligne colone
  11.    
  12.     cout << "init du tableau bidimentionel 11x11\n";
  13.     InitCarre(0, 11, Tab);
  14.     cout << "ajoute du 1\n\n";
  15.     Tab[4][5] = 1;
  16.     PrintCarre(11, Tab);
  17.     system("pause" );
  18.     }
  19.    
  20.     //affiche le carré, si le tab a 11 case de 0 a 10 passer 11 en para
  21.     void PrintCarre(long Length, long Tab[][11])
  22.        {
  23.        long Ln, Cl;
  24.        for(Ln=0; Ln<Length; Ln++)
  25.           {
  26.           for(Cl=0; Cl<Length; Cl++)     
  27.              {   
  28.              cout <<Tab[Ln][Cl]<<" ";   
  29.              }
  30.           cout<<"\n";
  31.           } 
  32.         cout<<"\n";
  33.         }
  34.    void InitCarre(long Number, long Length, long Tab[][11])
  35.       {
  36.       long Ln, Cl;
  37.       for(Ln=0; Ln<Length; Ln++)
  38.        {
  39.        for(Cl=0; Cl<Length; Cl++)     
  40.           {
  41.           Tab[Ln][Cl] = Number;           
  42.           }
  43.        }
  44.       }


 
neanmois, ok pour un tableau statique, je peux indiquer la taille avant compilation
 
mais dans le cas d'un tableau creer dynamiquement par exemple avec :
 

Code :
  1. long *tab;
  2. tab=new long*[NBLigne];
  3. for(int i=0;i<NBLigne;i++)
  4. tab[i]=new long[i];


 
avec NBLigne saisie avant par un CIN

Reply

Marsh Posté le 09-10-2010 à 08:31:29    

[:joel f:2]  : std::vector punaise, on ets pas en C

Reply

Marsh Posté le 09-10-2010 à 09:55:48    

j'ai deja preciser au post #3 que je n'ai PAS LE DROIT d'utiliser autre chose qu'un tableau.
 
c'est du C++ ecole

Reply

Marsh Posté le 09-10-2010 à 11:14:02    

Je ne comprends pas qu'on enseigne le C++ avec la façon de coder en C. Qu'ils fassent du C, et ensuite du C++, mais pas les deux en même temps. Enfin ce post n'a visiblement rien à faire en cat C++, ça n'est tout simplement pas du C++.

 

Quand à la question du tableau à 2D, ça doit être celle qui revient une fois par mois depuis 5 ans. C'est limite si ça ne serait pas utile de faire une page la-dessus et la mettre en sticky.:/


Message édité par el muchacho le 09-10-2010 à 11:21:00

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 09-10-2010 à 11:14:02   

Reply

Marsh Posté le 10-10-2010 à 10:10:01    

sliders_alpha a écrit :

j'ai deja preciser au post #3 que je n'ai PAS LE DROIT d'utiliser autre chose qu'un tableau.
 
c'est du C++ ecole


 
 [:joel f:1]  c'est donc une école de merde. On peut avori son nom que j'évite à mes étudiants d'y aller ?

Reply

Marsh Posté le 10-10-2010 à 10:13:17    

T'as loupé le 42 à 9 secondes près, la vie est dure :/

Reply

Marsh Posté le 10-10-2010 à 12:34:42    

j'ai vu à posteriori :€

Reply

Marsh Posté le 10-10-2010 à 12:37:23    

Je m'attendais à un brunch de barbus près de chez moi mais même pas...

Reply

Marsh Posté le 10-10-2010 à 18:38:28    

Joel F a écrit :


 
 c'est donc une école de merde. On peut avori son nom que j'évite à mes étudiants d'y aller ?


 
Dans mon ancienne école d'ingé, les gens qui faisait des formations chimie/physique avaient 2h d'info par semaine. Plutôt que de leur apprendre le C, ils ont fait du C++ impératif sans utiliser les espaces de nom, les concepts objets... apparemment, ça ressemblait surtout à du C avec deux trois trucs en plus (les stream pour faire des i/o, les vectors...). C'est pas con mais c'est un peu vain...

Reply

Marsh Posté le 10-10-2010 à 20:10:35    

c'est surtout complétement contre-productif. Si t'en ai la, apprendre du C++ propre n'est pas loin.

Reply

Marsh Posté le 10-10-2010 à 20:50:41    

Franchement je sais pas trop si c'est particulièrement mal... je ne pense pas que les profs aient présenté le contenu comme du C++, je crois que c'était plutôt présenté comme du C amélioré...  
 
Après la question, c'est de savoir si apprendre la programmation avec du C (ou du C amélioré) est une bonne idée. À l'ensimag, la programmation est enseignée avec l'ADA, ce qui n'est pas con.  
 
Les gens qui comprennent vite et bien, apprendre avec du C, c'est pas vraiment mauvais mais un programme en C peut tellement être sale que les gens mal intentionnés peuvent faire des grosses grosses bétises...

Reply

Marsh Posté le 11-10-2010 à 21:31:20    

Euh même pour du C c'est du mauvais :)

Reply

Sujets relatifs:

Leave a Replay

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