begin process at 2013 05 26 03:43:30
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Tutoriaux

 > PASSER UN TABLEAU A 2 DIMENSIONS A UNE FONCTION

PASSER UN TABLEAU A 2 DIMENSIONS A UNE FONCTION


 Information sur le tutoriel

Note :
Aucune note

 Description

Ce tuto vous montre comment passer un tableau a une fonction en utilisons les pointeurs.

J'espert que vous comprendrez car je suis pas doué pour expliquer lol

Tutorial

J'ai eu le meme probleme que toi moi aussi j'arrive pas a passer un tableau a 2 dimensions mais j'ai annalysé l'organisation d'un tableau a 2 dimensions en memoire et j'ai trouver ça comme soluce (tu comprendra avec ce ptit code source) :

void rec_tab( bool* tableau, int& taille_1, int& taille_2 ) // Fonction qui permetra de lire et modifier le tableau
{
      for ( int i_t1 = 0; i_t1<taille_1; i_t1++ )
      {
            for ( int i_t2 = 0; i_t2 < taille_2; i_t2++ )
                  tab[(int unsigned)((i_t1*taille_2)+i_t1))] = true;
      }
      /*                                             EXPLICATIONS
      Si par exemple on a un tableau qui est declarer de cette façon :
           bool tableau [ 2 ] [ 2 ];
      Cela revient a faire :
           bool tableau [ 4 ]; // Parce que 2 * 2 = 4
      donc pour acceder par exemple a l'index :
            tableau [ 1 ][ 0 ];
      suffit de faire :
            tableau [ 2 ];
      et pour :
            tableau [ 1 ][ 1 ];
      faut faire :
           tableau [ 2 + 1 ];
      
J'espert que vous m'avez compris lol */

}

int main ()
{
    int taille_dimension1, taille_dimension2;

   taille_dimension1 = 4;
   taille_dimension2 = 4;

     bool tableau [taille_dimension1][taille_dimension2] = {false}; // Declaration du tableau bool ( Rappelez vous qu'un bool est codé sur 1 octet )
 
     rec_tab ( tableau[0], taille_dimension1, taille_dimension2 );    
 
     return 0;
}

Commentaires

Commentaire de wlocity le 06/12/2008 16:25:44

salut,
j'ai lue le tuto et ça pas parait juste
mais je ne comprend pas ce que veux dire int& et pourquoi faire la conversion en unsigned int.
et encore pourquoi faire compliquer avec l'addition et la multiplication et usigned int lorsque tu peut faire juste tab[i][j], voici ce que je suggère:

#include <stdio.h>
#include <stdlib.h>
#define LM 5
#define HM 5

//initialisation du tableau
void rec_tab (bool tab[][5],int LM, int HM){
    for (int i=0;i<LM;i++){  //parcours en largeur
         for (int j=0;j<HM;j++){  //parcours en hauteur
             tab[i][j] = false;   //affectation
         }
    }
}

//affichage du tableau
void affiche_tab (bool tab[][5],int LM,int HM){
for (int i=0;i<LM;i++){
for(int j=0;j<HM;j++){
printf("%s,",tab[i][j]);
}
printf("\n");
}
}

//test des procedures
void main(){
bool t[LM][HM];
rec_tab (t,5,5);
affiche_tab(t,5,5);
_sleep(2500);
}

Commentaire de soso62fr le 06/12/2008 16:48:50

ouais ouais desolé y'a plein de fautes avec ce tuto mais j'ai fait ça rapidement et le code je l'est ecrit dans un editeur de texte je vais corriger ça dans peut de temp

Commentaire de soso62fr le 06/12/2008 17:00:56

Ben je sais pas comment modifier ce tuto :S mais sinon WLOCITY c'est justement cela qu'on peut pas faire ton code ne marche pas on dois proceder comme ça regarde ce code source :

void rec_tab( int* tableau, int taille_1, int taille_2 )
{
      for ( int i_t1 = 0; i_t1<taille_1; i_t1++ )
      {
            for ( int i_t2 = 0; i_t2 < taille_2; i_t2++ )
                  tableau[(int unsigned)((i_t1*taille_2)+i_t1)] = 1;
      }
}

int main ()
{
     int tableau [4][4] = {0};

     rec_tab ( tableau[0], 4, 4 );
    
     if( tableau[0][0] )
         cout << "Reussi" << endl;
     else
         cout << "Erreur" << endl;
    
     system("PAUSE");

     return 0;
}

Encors desolé pour ce tutos incompriensible mais j'ai fait ça en 2min et j'ai oublier de verifier

Commentaire de soso62fr le 06/12/2008 17:07:31

Compile ton code WLOCITY tu verra que ça ne marche...

Commentaire de soso62fr le 06/12/2008 17:11:30

Tu peut tester le mien avec cette fonction :

void affiche_tab( int* tableau, int taille_1, int taille_2 )
{
      for ( int i_t1 = 0; i_t1<taille_1; i_t1++ )
      {
            for ( int i_t2 = 0; i_t2 < taille_2; i_t2++ )
                  cout << tableau[(int unsigned)((i_t1*taille_2)+i_t1)] << endl;
      }
}

Commentaire de angel46 le 10/12/2008 00:51:50

Bonsoir/Bonjour

Etant etudiant, et ayant eut ce probleme il y'a quelque années, je me permet de repondre ^^
Pour placer un tableau a double dimension a une fonction, il y'a beaucoup plus simple:

void fonction( int **tab, int taille1, int taille2)

Et pour acceder a une valeur cela se fait normalemen : tab[i][j]

Au niveau pour appeller la fonction: fonction(monTab, 5, 5); // pas besoin de & vu que les noms de tableau sont deja des pointeurs.

Voila j'espere avoir pu vous aider ;)

Ps: exusez moi pour les fautes, vu l'heure j'ai pas le courage de les corigées.

Commentaire de soso62fr le 10/12/2008 12:22:23

Je vais tester cette soluce. Merci ANGEL46

Commentaire de bzrd le 16/12/2008 17:43:24

Désolé, la solution de ANGEL46 ne peut pas fonctionner car le système n'est pas capable de trouver la première dimension.

Si le tableau a des dimensions fixes, pourquoi ne pas faire simplement ça :
bool rec_tab(bool t[5][5])
{
   for (int i=0; i<5; i++)
     for (int j=0; j<5; j++)
       t[i][j] = false;
}

int main ()
{
     bool tableau [5][5]; // Declaration du tableau bool

     rec_tab (tableau);    
     return 0;
}

Commentaire de soso62fr le 16/12/2008 20:19:10

Oui c'est sur que ça marche ! mais regarde la signature de ta fonction ! Elle ne peut pas reçevoir un tableau de plus de 5 case pour les deux dimensions ! alors que ma fonction est dynamique, c'est a dire qu'elle peut reçevoir nimporte qu'elle nombre de cases :D

Commentaire de angel46 le 22/12/2008 08:40:24

BZRD, la solution que j'ai données marche ca fait maintenant plus de 4 ans que j'utilise des tableau a 2 dimension en C ^^, le systeme ne peut pas te dire que qu'il ne trouve pas la premiere dimension vu que tu lui passe un double pointeur (int **tab), apres libre a toi de passer les dimension comme tu le souhaite (en global, ds la signature...)

Commentaire de soso62fr le 22/12/2008 15:38:03

non non c'est le fait de declarer un tableau de qui me genne "bool rec_tab(bool t[5][5])" car imaginons que le tableau qu'on envoye a cette fonction est un tableau de 10 cases de chaque dimension autrement dit un tableau comme ça "bool t[10][10]" :S

Commentaire de soso62fr le 22/12/2008 15:40:46

Mais bon c'est sur qu'il y'a plusieurs solutions pour gerrer les tableaus a plusieurs dimensions mais moi j'ai choisit cette solution :

void rec_tab( int* tableau, int taille_1, int taille_2 )
{
      for ( int i_t1 = 0; i_t1<taille_1; i_t1++ )
      {
            for ( int i_t2 = 0; i_t2 < taille_2; i_t2++ )
                  tableau[(int unsigned)((i_t1*taille_2)+i_t1)] = 1;
      }
}

Commentaire de angel46 le 23/12/2008 10:29:02

J'ai pas compris ton avant dernier commentaire SOSO62FR ?

Commentaire de soso62fr le 23/12/2008 19:23:27

Je m'exscuse ANGEL46 car j'ai ecrit ce commentaire sans reflichir lol car meme si le tableau bool tableau est de 5 cases on peut toujour accrementer son adresse pour aller plus loin :)

Commentaire de soso62fr le 23/12/2008 19:30:00

mais je te reecrit mon commentaire comme meme :

---------------------------------------------------------

BZRD ce qui ne va pas dans ta solution est que tu declare un tableau de 5 cases donc cela ne marcherai pas pour un tableau de plus de 5 cases c'est a dire qu'il nous est impossible de faire cela :
bool tableau [10][10];
rec_tab(tableau);

---------------------------------------------------------

BIEN SUR CE QUE J'AI DIT N'A PAS DE SENS CAR ON PEUT TOUJOUR ACCREMENTER L'ADRESSE !!

Commentaire de melka85 le 26/12/2008 21:28:51

salut,
on peut aussi déclarer notre tableau à deux dimensions comme étant un champ dans une structure :

typedef struct Matrice{
int nbligne;
int nbcolonne;
int ** DATA;
} MATRICE;

après l'utilisation du tableau à deux dimension (déclaré :int ** DATA) est simple:

voici une fonction pour initialiser un tableau à 2 dimensions :

void Saisi_Mat(struct Matrice matrice)
{
int i,j;

    
    for( i=0; i<matrice.nbligne; i++ )
for( j=0; j<matrice.nbcolonne; j++ )
{
printf("matrice(%d,%d) : ", i, j);
scanf("%d", &matrice.DATA[i][j]);
}
}

une deuxième fonction pour afficher les éléments du tableau à 2 dimensions :

void Affich_Mat(struct Matrice matrice)

{
int i, j;
for( i=0; i<matrice.nbligne; i++ )
for( j=0; j<matrice.nbcolonne; j++ )
{
printf("\n %d", matrice.DATA[i][j]);

}
printf("\n");
}

Commentaire de mohamedsnina le 03/02/2009 17:53:49

je travaille avec la methode de monte carlo et j'ai besoin d'une documentation sur les traceurs

Commentaire de sdevilcry le 27/02/2009 17:09:20

hum en faites quand tu passes un tableau que tu as alloué dynamiquement il n'y a pas de warning ou autres problèmes, mais quand tu le déclares ton tableau en statique le compilateur rale, ce qui est tout a fait normal :)
De ce fait si tu veux avoir un tableau dynamique, tu procèdera comme cela :
exemple :
#include <stdlib.h>
#include <stdio.h>

void    display_tab(int **tab)
{
  int   x;
  int   y;

  for (y = 0; tab[y]; y++)
  {
    for (x = 0; x < 5; x++)
      printf("%d", tab[y][x]);
    printf("\n");
  }
}

int     main(void)
{
  int   **tab;
  int   i;

  tab = malloc(5 * sizeof(int *));
  for (i = 0; i < 5; i++)
  {
    tab[i] = malloc(5 * sizeof(int));
    for (x = 0; x < 5; x++)
      tab[i][x] = 1;
  }

  tab[i] = NULL;
  display_tab(tab);
  return (0);
}
Et sur la sortie j'ai bien mon tableau afficher :)

Pour le statique, il faut simplement lui donner dans la déclaration de la fonction, le tableau contenant le nombre de case... :
void    display_tab(int tab[5][5])
{
  int   x;
  int   y;

  for (y = 0; y < 5; y++)
  {
    for (x = 0; x < 5; x++)
      printf("%d", tab[y][x]);
    printf("\n");
  }
}

int     main(void)
{
  int   tab[5][5];
  int   i;
  int   x;

  for (i = 0; i < 5; i++)
    for (x = 0; x < 5; x++)
      tab[i][x] = 1;
  display_tab(tab);
  return (0);
}

La seconde façon ça ne sert a rien de vouloir faire une déclaration dynamique si le tableau ne l'est pas... Et puis pour la lecture du code on s'est dessuite si le codeur a fait un tableau dynamique ou statique :)
Espérant avoir aider :)

Commentaire de soso62fr le 21/03/2009 16:31:57

Salut sdevilcry
Ta solution m'a l'air bien mais j'ai pas encore tester.
Sinon ta oublier de declarer le var x dans le main de la premiere solution.
Ciao

Commentaire de xboxut le 26/11/2009 14:18:56

pas bon

Commentaire de soso62fr le 26/11/2009 18:56:24

Xboxut, ce serait sympa et plus compriensible de develloper, malgré que c'est un ancien tuto !

Commentaire de xboxut le 27/11/2009 13:35:14

ok je développe ;).
Au niveau pédagogique, ton tuto vaut pas grand chose. Coté code c'est assez dégueu, tu ne parle pas de la manière dont les tableau statiques 2d sont représentés dans la mémoire etc... et surtout tu ne parles pas des tableaux dyna :s.

Commentaire de soso62fr le 27/11/2009 13:46:32

Tout à fait d'accord avec toi xboxut ! Ce tuto est sans utilité, faux et dégueu, mais bon y a été écrit il y a 1 an et à ce moment là je pouvais pas faire mieux ^^ c'est possible de le supprimer ?

Commentaire de xboxut le 27/11/2009 14:04:38

Améliore le sinon ;)

Commentaire de soso62fr le 27/11/2009 14:13:20

Bonne idée! Je ferai des modifications dés que j'aurais le temps :)

Commentaire de polytechniquesousse le 10/02/2010 21:21:31

  j'ai dans la fonction principale un tableau a deux dimensions !
    après avoir rempli ce tableau par l'utilisateur , je veut permuter deux ligne de ce tableau tel que la ligne qui a la 1er case contenant la valeur la plus grande sera permuté avec la 1ere ligne du tableaux.

j'aimerai passe ce tableau a deux dimension  a la fonction permut !! esq qq peut me corriger
dans la fonction principale jai la fonction permut comme suit :

  permut(t,nb1,nb2);

  avec t:nom de mon tableau ; nb1 c la taille en largeur , nb2 c la taille en hauteur!
voila la fonction permuter:

  void permut (float **t ,int &nb1, int &nb2 )
   {
    float tab[10] ;
     int i,j,k=0;

     for (i=1;i<nb1;i++)
     {
      if (t[i][0]>t[0][0])
       k=i;
     }
    if (k!=0)
    {
     for(j=0;j<nb2;j++)
     {
      tab[j]=t[0][j];
      t[0][j]=t[k][j];
      t[k][j]=tab[j];
     }
    }
    }

Commentaire de soso62fr le 11/02/2010 01:05:59

Bonsoir polytechniquesousse.

Pour ta fonction, tu pourais la faire de cette maniere :

void permut (float **t ,int &nb1, int &nb2 ) {

    for ( int i=1; i<nb1; i++ ) {

        if ( t[i][0] > t[0][0] ) {

            float tmpVal;
        
            for( int j=0; j<nb2; j++ ) {
              
               tmpVal  = t[0][j];
               t[0][j] = t[k][j];
               t[k][j] = tmpVal;
            }
        }
    }
}

Voilà, salut ;)

Commentaire de soso62fr le 11/02/2010 01:07:23

Euhh pardon j'ai fait une petite erreur, voilà je remet le code :

void permut (float **t ,int &nb1, int &nb2 ) {

    for ( int i=1; i<nb1; i++ ) {

        if ( t[i][0] > t[0][0] ) {

            float tmpVal;
        
            for( int j=0; j<nb2; j++ ) {
              
               tmpVal  = t[0][j];
               t[0][j] = t[i][j];
               t[i][j] = tmpVal;
            }

            break;
        }
    }
}

Voilà, salut ;)

Commentaire de soso62fr le 11/02/2010 01:29:14

Un autre truc, j'ai remarqué que ta mis 'int &nb1, int &nb2' cela est vraiment inutile car ces deux variables ne
subbissent aucune modification dans le corps de la fonction.

Si tu passes ces deux variables par référence car tu penses qu'une copie de valeurs est plus lourde, sache que c'est pas valable dans tout les cas, car ici sa fait un effet inverse.
Il vaut mieux faire une copie de valeurs, car dans le cas d'une remise à jour ou d'une maintenance du code par exemple, on peut apprendre simplement par la signature de ta fonction que les deux variables ne seront pas modifiées.

Commentaire de polytechniquesousse le 11/02/2010 20:58:07


  merci d'abord soso62fr ;
   mon problème c'est pas comment faire la permutation ; déjà ma méthode est satisfaisante et optimale
ça marche bien quand je n'utilise pas de fonction , je fait ce traitement dans la fonction principale!

  mon pb c comment passer un tableau a deux dimension a une fonction !! le tableau passé à la fonction va être modifié ! et aussi je ne c pas comment déclarer une tableau a deux dimension dynamiquement

Commentaire de soso62fr le 12/02/2010 02:53:43

POLYTECHNIQUESOUSSE : mon pb c comment passer un tableau a deux dimension a une fonction ..

Ben ta méthode est bonne, c'est correcte. Je vois pas de problemes.

POLYTECHNIQUESOUSSE : je ne c pas comment déclarer une tableau a deux dimension dynamiquement ..

Tu le déclare de cette maniere :

type **tab = (type**) malloc ( lTab * sizeof(type*) );

dans ce code là tu alloues 'lTab' pointeurs de type 'type' donc aprés tu doit faire ça :

tab [ 0 ] = (type*) malloc ( sizeof ( type ) );

Pour faire pointer les pointeurs vers une zone de memoire valide.

Voilà un code complet pour ton cas :

int lTab = 10; // Largeur du tableau
int hTab = 10; // Hauteur du tableau

float **tab = (float**) malloc ( lTab * sizeof(float*) );

if ( tab != NULL ) {

     for ( int i = 0; i<lTab; i++ ) {

         tab [ i ] = (float*) malloc ( hTab * sizeof ( float ) );

         if ( tab [ i ] == NULL )
             exit ( EXIT_FAILURE );

     }

}


--------------- LIBERATION DE LA MEMOIRE ---------------------

for ( int i = 0; i<lTab; i++ )
    free ( tab [ i ] );

free ( tab );


Voilà mon amis !

Commentaire de soso62fr le 12/02/2010 02:56:43

Une petite erreur encore mdr :

tab [ 0 ] = (type*) malloc ( sizeof ( type ) );

c'est pas bon, voilà la correction :

tab [ 0 ] = (type*) malloc ( hTab * sizeof ( type ) );

Commentaire de Tutur66 le 28/04/2010 19:02:35

Moi j'ai toujours utilisé cette solution :
#define WIDTH 10
#define HEIGHT 10
void maFonction(tab[][HEIGHT]);

C'est pour moi la meilleure solution pour ce qui est d'un tableau statique.

Commentaire de soso62fr le 28/04/2010 21:41:35

Oui c'est une solution, surement la meilleure si on manipule qu'un seul tableau à deux dimensions...
Si on manipule plusieurs tableaux, vaut mieux faire passer directement les dimensions à la fonction...

Commentaire de Nitrakz le 18/08/2010 11:34:08

Pourquoi envoyer les tailles des index, initialiser simplement les dernières valeurs a NULL

Commentaire de mkhadi le 05/11/2010 20:18:56

je remercieux vous avotre effort et votre aid
  je demander un petit programme de regréssion liainére
   aussi un comment je faire un somme un ensemble de des numbre

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales