IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

fonction qui retourne un tableau bidimentionnel


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien d'exploitation informatique
    Inscrit en
    Avril 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien d'exploitation informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 88
    Par défaut fonction qui retourne un tableau bidimentionnel
    salut,

    je debute et j'aimerais creer un tableau bidimentionnel 4*3 dans une fonction et l'utiliser en dehors. (sans utiliser return)

    j'ai essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void creerUneGrille(int ***grilleMap)
    {
    **grilleMap=malloc(sizeof(int)*4*3); 
     
     
     
    grilleMap[2][2]=3; // je veux que ma case 2 2 vaut 3
     
    }
     
    int **grille=NULL;
     
    creerUneGrille(&grille);
     
    printf("%d",grille[2][2]);//pour l'exemple j'affiche la case 2 2


    Si vous pouvez me dire ce qu'il ne va pas ca serait gentil,

    je dois m'embrouiller avec les pointeurs de pointeurs :/

    Merci !

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    En fait, les vrais tableaux multidimensionnels sont difficile à utiliser dans une fonction parce qu'on doit spécifier très exactement leurs dimensions (sauf une, ce qui fait les tableaux unidimensionnels simples à utiliser).
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include <stdlib.h>
    void creerUneGrille(int (**grilleMap)[3]) // le '3' est obligatoire
    {
      *grilleMap=malloc(4*sizeof ** grilleMap);
      if (*grilleMap != NULL)
      {
         (*grilleMap)[1][2] = 123;
      }
    }
    int main(void)
    {
      int (*grille)[3]=NULL; // le '3' est obligatoire
      creerUneGrille(&grille); 
      if(grille != NULL) grille[2][1] = 456;
      return 0;
    }
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdlib.h>
    int (*creerUneGrille())[3]
    {
      int (*grilleMap)[3];
      grilleMap=malloc(4*sizeof * grilleMap);
      if (grilleMap != NULL)
      {
         grilleMap[1][2] = 123;
      }
      return grilleMap;
    }
    int main(void)
    {
      int (*grille)[3]= creerUneGrille();
      if(grille != NULL) grille[2][1] = 456;
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void creerUneGrille(int ***grilleMap)
    Dans notre cas, ceci suppose que grilleMap est l'adresse d'un tableau de int**. *grilleMap est donc un int** autrement dit, dans notre cas, l'adresse du début d'un tableau de pointeurs int*
    En fait, tu veux construire un tableau (unidimensionnel) de pointeurs int* , chaque pointeur contenant l'adresse d'un tableau de int (représentant l'adresse de début d'une ligne du pseudo tableau 2D).
    Ce n'est pas à proprement parler un tableau bidimensionnel mais ça se manipule ensuite exactement comme un tableau bidimensionnel. Comme on passe le tableau de pointeurs, tableau à une dimension, on évite le problème des dimensions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdlib.h>
    void creerUneGrille(int *** grilleMap)
    {
      *grilleMap=malloc(4*sizeof(int *)); // le tableau de pointeurs
      if (*grilleMap != NULL)
      {
         (*grilleMap)[0] =  malloc(4*3*sizeof(int));// le tableau des données
         if ((*grilleMap)[0] != NULL)
         { //initialiser les pointeurs sur chaque "ligne" du tableau des données
            int i;
            for(i =1; i<4;i++)(*grilleMap)[i]= (*grilleMap)[0] + i*3 ;
            (*grilleMap)[1][2] = 123;
         }
         else
         {  // erreur d'allocation : retourner NULL
           free(*grilleMap);
           *grilleMap = NULL;
         }
      }
    }
    int main(void)
    {
      int **grille ;
      creerUneGrille(&grille);
      if(grille != NULL) grille[2][1] = 456;
      return 0;
    }
    Ou en utilisant la valeur de retour de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <stdlib.h>
    int ** creerUneGrille(void)
    {
      int **grilleMap=malloc(4*sizeof(int *)); // le tableau de pointeurs
      if (grilleMap != NULL)
      {
         grilleMap[0] =  malloc(4*3*sizeof(int));// le tableau des données
         if (grilleMap[0] != NULL)
         { //initialiser les pointeurs sur chaque "ligne" du tableau des données
            int i;
            for(i =1; i<4;i++)grilleMap[i]= grilleMap[0] + i*3 ;
            grilleMap[1][2] = 123;
         }
         else
         {  // erreur d'allocation : retourner NULL
           free(grilleMap);
           grilleMap = NULL;
         }
      }
      return grilleMap;
    }
    int main(void)
    {
      int **grille = creerUneGrille();
      if(grille!=0)grille[2][1] = 456;
      return 0;
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien d'exploitation informatique
    Inscrit en
    Avril 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien d'exploitation informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 88
    Par défaut
    Merci pour ta réponse !

    Je vais la lire plus en détail demain quand j'aurais un peu plus le temps.

    Je te donnerais mes impressions.

    Bonne soirée

Discussions similaires

  1. [Tableaux] Fonction qui retourne un tableau
    Par benooiit dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2007, 01h50
  2. Réponses: 6
    Dernier message: 22/09/2006, 18h17
  3. Fonction qui retourne un tableau ou 2 variables ? possible ou non
    Par jiojio dans le forum VB 6 et antérieur
    Réponses: 45
    Dernier message: 05/06/2006, 15h00
  4. [VB] Fonction qui retourne un tableau
    Par ptitsoleil87 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 24/12/2005, 10h52
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo