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 :

tableau de pointeur 3d


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Par défaut tableau de pointeur 3d
    Bonjour à tous, je suis entrain de faire des tests sur les tableau 3D, à la base afin de pouvoir déclarer le tableaux dans le main pour ensuite l’initialiser dans une fonction : j'ai donc fait comme ceci :

    J'ai initialise un tableau de 3 pointeur qui référencent chacun un tableau de 3 pointeur et ces derniers pointeurs référencent l'adresse du premier octet d'un tableau de char . Du moins c'est ce que je pense avoir fait ^^ comme ça fonctionne je me dit que ça doit être ça .

    Car en initialisant ces sous tableau de pointeur avec une phrase entre parenthèse cela fonctionne, y me semble que c'est le même principe en assembleur pour le peu que j'en ai fait à part que je ne doit pas indiquer le caractère de fin de chaine ,
    on crée un pointeur et on enregistre directement la phrase .

    Au final ça me permet de créer des chaines de caractères de la taille que je veux, y me semble .

    J'aimerai savoir ce que les connaisseurs en pensent, car je suis arrive à ce résultat en bidouillant après quelques échecs , est ce que c'est une bonne technique ou est ce que je me suis compliqué la vie inutilement ?

    voici l' test.exe pour voir le résultat en console .

    https://rapidshare.com/files/1463036/test.rar

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
     
    #include <stdio.h>
     
    void chargerTableau( char * (*phrase[3])[3]  )// char ** phrase
    {
     
         //printf("%p contient %d\n",phrase,*phrase);
     
        (*phrase)[0][0] = "bonjour1 ";
        (*phrase)[0][1] = "bonjour2 ";
        (*phrase)[0][2] = "bonjour3 ";
     
        (*phrase)[1][0] = "bonjour4 ";
        (*phrase)[1][1] = "bonjour5 ";
        (*phrase)[1][2] = "bonjour6 ";
     
        (*phrase)[2][0] = "bonjour7 ";
        (*phrase)[2][1] = "bonjour8 ";
        (*phrase)[2][2] = "bonjour9 ";
     
     
     
         printf("contenu : %s, [7] : %c, adresse : %d, adresse2 : %d\n"
                             ,(*phrase)[0][0],(*phrase)[0][0][7],&(*phrase)[0][0]
                             ,(*phrase)[0][0]);
     
         printf("contenu : %s, [7] : %c, adresse : %d, adresse2 : %d \n"
                             ,(*phrase)[0][1],(*phrase)[0][1][7],&(*phrase)[0][1]
                             ,(*phrase)[0][1]);
     
         printf("contenu : %s, [7] : %c, adresse : %d, adresse2 : %d \n\n"
                             ,(*phrase)[0][2],(*phrase)[0][2][7],&(*phrase)[0][2]
                             ,(*phrase)[0][2]);
     
     
         printf("contenu : %s, [7] : %c, adresse : %d\n",(*phrase)[1][0]
                             ,(*phrase)[1][0][7],&(*phrase)[1][0]);
     
         printf("contenu : %s, [7] : %c, adresse : %d\n",(*phrase)[1][1]
                             ,(*phrase)[1][1][7],&(*phrase)[1][1]);
     
         printf("contenu : %s, [7] : %c, adresse : %d\n\n",(*phrase)[1][2]
                             ,(*phrase)[1][2][7],&(*phrase)[1][2]);
     
         printf("contenu : %s, [7] : %c, adresse : %d\n",(*phrase)[2][0]
                             ,(*phrase)[2][0][7],&(*phrase)[2][0]);
         printf("contenu : %s, [7] : %c, adresse : %d\n",(*phrase)[2][1]
                             ,(*phrase)[2][1][7],&(*phrase)[2][1]);
         printf("contenu : %s, [7] : %c, adresse : %d\n\n",(*phrase)[2][2]
                             ,(*phrase)[2][2][7],&(*phrase)[2][2]);
     
     
    }
     
    void testTableau( char * (*phrase[3])[3] )
    {
     
        printf("\n%s %c\n",(*phrase)[1][2],(*phrase)[1][2][6]);
     
        if( (*phrase)[1][2][6] == 'r' )
        printf("%c = r",(*phrase)[1][2][6]);
     
     
    }
     
     
    int main()
    {
     
     
     
        char * (*phrase[3])[3] ; // = ** phrase
     
     
     
            printf(" adresse du premier tableau de ponteur : [%d] \n\n",phrase);
            printf(" 1er  pointeur sur tab de pointeur : [%d]  \n",(*phrase)[0]);
            printf(" 2eme pointeur sur tab de pointeur : [%d]  \n",(*phrase)[1]);
            printf(" 3eme pointeur sur tab de pointeur : [%d]  \n\n",(*phrase)[2]);
            printf(" On obtient bien des adresses contigues \n separees "
                   "de 3 * 4 octets ( taille d une adresse )\n\n");
     
            chargerTableau( phrase );
     
            printf(" %d %s %c\n",&(*phrase)[0][1],(*phrase)[0][1],(*phrase)[0][1][7]);
     
     
        while(1);
       // testTableau(phrase);
    }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 473
    Par défaut
    Hello,

    Citation Envoyé par zakuza Voir le message
    Car en initialisant ces sous tableau de pointeur avec une phrase entre parenthèse cela fonctionne, y me semble que c'est le même principe en assembleur pour le peu que j'en ai fait à part que je ne doit pas indiquer le caractère de fin de chaine ,on crée un pointeur et on enregistre directement la phrase .
    C'est la même chose : tu es obligé de placer une sentinelle en fin de chaîne également (avec les interruptions D.O.S., c'était « $ ») ou de passer la taille de la chaîne en paramètre.

    J'aimerai savoir ce que les connaisseurs en pensent, car je suis arrive à ce résultat en bidouillant après quelques échecs , est ce que c'est une bonne technique ou est ce que je me suis compliqué la vie inutilement ?
    Ces tests te seront très profitables, sans aucun doute. Malgré tout, ils peuvent semer la confusion dans ton esprit, car le C a une manière bien définie de gérer ses tableaux. La confusion entre tableaux et pointeurs est assez fréquente car on peut utiliser l'un comme si c'était l'autre dans pratiquement tous les cas.

    Tu peux effectivement faire des tableaux de pointeurs. C'est utile lorsque l'on gère des listes de chaînes, par exemple. Toutefois, les tableaux, même multidimensionnels, du C, n'en utilisent aucun. Lorsque tu écris « char tab[10][10][10]; », le C réserve l'espace pour exactement 10×10×10 caractères consécutifs, sans pointeur additionnel en mémoire. L'adresse du tableau, qui t'est donnée lorsque tu invoques le nom du tableau seul sans ses crochets, est déterminée à la compilation et la position de chaque caractère en est déduite.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par zakuza Voir le message
    J'aimerai savoir ce que les connaisseurs en pensent, car je suis arrive à ce résultat en bidouillant après quelques échecs , est ce que c'est une bonne technique ou est ce que je me suis compliqué la vie inutilement ?
    Personellement, et bien que ce ne soit pas la structure la plus efficace pour ce problème, si j'utilisais des tableaux 3D j'aurais fait :

    Code C : 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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #define SUCCESS 1
    #define ERROR  0
     
    int New_Phrase ( char ****Phrases, int *NPhrases, int **NbWords )
    {
        int    s = ERROR ;
        char ***tmp=NULL ;
        int     *tmpint ;
     
        tmp = realloc ( *Phrases, ((*NPhrases+1)*sizeof(char***)) );
        if ( tmp != NULL )
          {
               *Phrases = tmp ;
               tmpint = realloc ( *NbWords, ((*NPhrases+1)*sizeof(int)) );
               if ( tmpint != NULL )
                 {
                     *NbWords = tmpint ; 
                     *NbWords[*NbPhrases] = 0 ;
                     *NbPhrases = *NbPhrases + 1 ;
                     s = SUCCESS ;
                 }
          }
     
       return s ;
    }
     
    int New_Word ( char ***Phrase, int *NWords, char *Word )
    {
        int   l=strlen(Word), s=SUCCESS;
        char **tmp ;
     
        if ( l > 0 )
          {
             tmp = realloc ( *Phrase, ((*NWords+1)*sizeof(char**) );
             if ( tmp != NULL )
               {
                    *Phrase = tmp ;
                    if ( ((*Phrase)[*NWords] = calloc(l, sizeof(char))) != NULL )
                      {
                           strcpy ( (*Phrase)[*NWords], Word );
                           *NWords = *NWords + 1 ;
                      }
                    else
                         s = ERROR ;
               }
            else
                s = ERROR ;
          }
     
       return s ;
    }
     
     
    int main ( void)
    {
        char ***Phrases=NULL ;
        int     NbPhrases=0, *NbWords=NULL, numphrase ;
        int     s = SUCCESS ;
     
       while ( s == SUCCESS )
         {
            numphrase = NbPhrase ;
            if ( (s=New_Phrase ( &Phrases, &NbPhrases, &NbWords )) == SUCCESS )
              {
                for ( ......)
                  {
                    if ( (s=New_Word ( &(Phrases[numphrase]), &(NbWords[numphrase]), "Bonjour" )) == ERROR )
                        break ;
                  }
              }
         }
     
       if ( s == ERROR )
         {
              fprintf ( stderr, "\n Une erreur mémoire est apparue");
              return EXIT_FAILURE ;
          }
     
        ....
     
       return EXIT_SUCCESS ;
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Par défaut
    merci pour vos réponses je regarderai de plus prés ta solution souviron34 la je manque un peu de temps . Depuis j'ai compris deux trois truc , j'aurai pu utiliser un const char * phrase[3] [3] .

    pour y enregistrer les * const char se trouvant dans la fonction .
    Le problème c'est que je ne peux pas modifier les tableaux après donc c'est selon l'usage .

Discussions similaires

  1. Tableau de pointeur de fonction
    Par Gryzzly dans le forum C
    Réponses: 7
    Dernier message: 31/12/2005, 10h47
  2. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  3. [GCC] Tableau de pointeurs pour accès multiples en asm
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 12/12/2005, 08h47
  4. tableau de pointeurs
    Par seal3 dans le forum C++
    Réponses: 7
    Dernier message: 01/11/2005, 20h51
  5. Tableau de pointeurs de fonctions
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 29/10/2005, 13h19

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