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 :

Char*** besoin d'un exemple


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Char*** besoin d'un exemple
    Bonjour,

    Jusqu'ici j'ai souvent utiliser des char* alloué dynamiquement ansi que des char** de temps en temps.
    Là je fait un projet qui va me demmander de faire un tableau tridimentionel , cad en statique: char tableau[40][60][20]; voila pour aller vite.

    Je voudrais savoir si vous aviez des exemples pour allouer (malloc & realloc) pour une char*** , car les exemples sont rares sur le net.

    merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Eh bien tu peux faire comme 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    // char tableau[40][60][20];
    char ***tab;
     
    tab = malloc(40 * sizeof(char **));
    if (tab == NULL)
    {
      fprintf(stderr, "bye bye, j'ai un pb memoire");
      exit(EXIT_FAILURE);
    }
    for(i = 0; i < 40; i++)
    {
        if ((tab[i] = malloc(60 * sizeof(char *))) == NULL) 
        {
           // on désalloue tout
           for( j = 0; j < i; j++)
           {
              // pour chaque tab[j], il faut désallouer les 60 chaines de 20 car
               for(k = 0; k < 60; k++)
                    free(tab[j][k]);
              free(tab[j]);
          }
           // on desalloue tab
           free(tab);
           fprintf(stderr, "bye bye, j'ai un autre pb memoire");
           exit(EXIT_FAILURE);
        }
        for(j = 0; j < 60; j++)
        {
            if ((tab[i][j] = malloc(20)) == NULL)
            {
               // on desalloue encore et on sort la queue basse
             }
        }
    }
    Attention, le code n'est pas testé mais c'est l'idéee

    Il faudra ensuite pensé à bien désallouer tout dans l'ordre inverse de l'allocation
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ah d'accord!
    Merci pour ta reponse rapide & claire.

    Tu ma rappeler que j'ai completement oublier de desalloué mes char** :s

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Attention entre temps j'ai modifié le code car j'avais oublié quelque chose !
    Toujours pas testé quand même.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    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
     
    #include <stdio.h>
    #include  <stdlib.h>
     
    int main(void)
    {
    	char *** T3D;
    	int i, j;
     
    	T3D = (char***) malloc (10*sizeof(char**));
    	for (i = 0 ; i < 10 ; i++)
    	{
    		T3D[i] = (char**) malloc (15*sizeof(char*));
    		for (j = 0 ; j < 15 ; j++)
    		{
    			T3D[i][j] = (char*) malloc (20*sizeof(char));
    		}
    	}
    	***T3D = 'a';
     
    	printf("%c\n", ***T3D);
    	printf("%c\n", T3D[0][0][0]);
    	return (0);
    }

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Bravo pour la sureté et la propreté du code !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    thank Hassanibi

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par hassanibi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	***T3D = 'a';
     
    	printf("%c\n", ***T3D);
    	printf("%c\n", T3D[0][0][0]);
    	return (0);
    Tester en 0, c'est facile. Aux limites, c'est plus interessant...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par hassanibi
    <...>
    Très minimaliste...
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define X 2
    #define Y 3
    #define Z 4
     
    int main (void)
    {
       char ***T3D = malloc (X * sizeof *T3D);
     
       if (T3D != NULL)
       {
          int err = 0;
          size_t i;
     
          for (i = 0; i < X; i++)
          {
             size_t j;
     
             T3D[i] = malloc (Y * sizeof *T3D[i]);
     
             if (T3D[i] != NULL)
             {
                for (j = 0; !err && j < Y; j++)
                {
                   size_t k;
     
                   T3D[i][j] = malloc (Z * sizeof *T3D[i][j]);
     
                   if (T3D[i][j] != NULL)
                   {
                      for (k = 0; k < Z; k++)
                      {
                         T3D[i][j][k] = i + j + k;
                      }
                   }
                   else
                   {
                      err = 1;
                   }
                }
             }
          }
     
          if (!err)
          {
             ***T3D = 'a';
     
             printf ("%c\n", ***T3D);
             printf ("%d\n", T3D[X - 1][Y - 1][Z - 1]);
          }
     
          /* liberation */
          for (i = 0; i < X; i++)
          {
             size_t j;
             for (j = 0; j < Y; j++)
             {
                free (T3D[i][j]), T3D[i][j] = NULL;
             }
             free (T3D[i]), T3D[i] = NULL;
          }
          free (T3D), T3D = NULL;
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre du Club
    Inscrit en
    Août 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 62
    Points : 63
    Points
    63
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par hassanibi
    <...>
    Très minimaliste...
    [/code]
    c'est just un exemple pour donner une idée à *xAx* et c'est à lui de penser aux tests et liberation de memoire

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ya aucun probleme, je suis vos idées (alloué/verifier (bon=ont continue,pas bon=ont desalloue si besoin + message d'erreur + exit)/desallouer).

    merci en tout cas!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EJB MDB] Besoin d'un exemple en JMS-MDB
    Par jaljal dans le forum Java EE
    Réponses: 3
    Dernier message: 07/10/2009, 17h27
  2. Besoin d'un exemple d'une application web faite en PHP
    Par bonheurdumonde dans le forum Langage
    Réponses: 2
    Dernier message: 21/08/2009, 19h37
  3. Besoin d'exemple d'utilisation d'un MouseListener
    Par hbzied dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 20/04/2006, 11h27
  4. besoin d'un exemple de formulaire...car j'ai un ptit problem
    Par anthonycosson dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/03/2006, 18h51
  5. besoin d'un exemple de prog utilisant les fichiers
    Par b_steph_2 dans le forum C++
    Réponses: 10
    Dernier message: 25/11/2005, 09h03

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