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 :

structure transtypée vers tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut structure transtypée vers tableau
    Bon après-midi,

    La joie des pointeurs, encore plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    size_t i;
    char *hashedbuff[1024] = {0};
    struct nlist *np;
     
       for ( i = 0 ; i < HASHSIZE ; i++ ) {
          for ( np = table[i] ; np != NULL ; np = np->next ) {
     
             hashedbuff[i] = (char *) malloc (1 + strlen( np->name)  * sizeof(char));
             strcpy(hashedbuff[i], np->name);
             printf ( "tableauIfie\t\t%s", hashedbuff[i] );
          }
       }

    En dehors de la boucle, printf donne hashedbuff[0] = NULL

    Je nage toujours ...

  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
    Pourquoi ce titre qui n'a rien à voir avec ton problème ?

    Je ne comprend pas pourquoi tu as une double boucle. A l'intérieur tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
             hashedbuff[i] = (char *) malloc (1 + strlen( np->name)  * sizeof(char));
    Ceci implique que hashedbuff[i] est écrasé par une nouvelle valeur à chaque fois que tu fais un tour de boucle sur np.

  3. #3
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    Pourquoi ce titre qui n'a rien à voir avec ton problème ?
    Parce que je croyais que c'était ce que je faisais.

    Je ne comprend pas pourquoi tu as une double boucle.
    Parce que je parse une série de structures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char *buff[2048] = {0};
    struct nlist {
       struct nlist *next;
       char *name;
       char *defn;
    };
    static struct nlist *hashtab[HASHSIZE];
    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
     
    struct nlist *install( char *name, char *defn ) {
       struct nlist *np;
       unsigned hashval;
     
       if ( ( np = lookup( name ) ) == NULL ) {   /*  not found  */
          np = ( struct nlist* ) malloc( sizeof( *np ) );
     
          if ( NULL == np  || NULL == ( np->name = strdup( name ) ) )
             return NULL;
     
          hashval = hash( name );
          np->next = hashtab[hashval];
          hashtab[hashval] = np;
       } else /*  already there  */
          free( ( void* ) np->defn );   /*  free previous definiition  */
     
       if ( NULL == ( np->defn = strdup( defn ) ) )
          return NULL;
     
    return np;
    }
    Ceci implique que hashedbuff[i] est écrasé par une nouvelle valeur à chaque fois que tu fais un tour de boucle sur np.
    i est censé changer. Il n'y a qu'un seul np->name pour chaque table[i] . . . non?

  4. #4
    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
    i est censé changer.
    i ne changera que lorsqu'on sera arrivé à np == NULL, pas avant.
    Il n'y a qu'un seul np->name pour chaque table[i] . . . non?
    Normalement, c'est toi qui le sait. Mais alors, pourquoi cette boucle sur np ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          for ( np = table[i] ; np != NULL ; np = np->next ) {
    ....
             strcpy(hashedbuff[i], np->name);

  5. #5
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    Ceci ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       for ( i = 0 ; i < HASHSIZE ; i++ ) {
             np = table[i];
             hashedbuff[i] = (char *) malloc (1 + strlen( np->name)  * sizeo(char));
             strcpy(hashedbuff[i], np->name);
             printf ( "tableauIfie\t\t%s", hashedbuff[i] );
       }
    Double boucle. Ceci fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       for ( i = 0 ; i < HASHSIZE ; i++ ) {
          for ( np = table[i] ; np != NULL ; np = np->next ) {
             printf ( "%s", np->name );
          }
    }
    Ceci n'imprime qu'un seul nom.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          for ( ; np != NULL ; np = np->next ) {
             printf ( "%s", np->name );
          }
    Ceci aussi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf ( "%s", np->name );
    Simple boucle. Ceci ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       for ( i = 0 ; i < HASHSIZE ; i++ ) {
          np = table[i];
             printf ( "%s", np->name );
          }
    Ma table de hashage est-elle mal construite?

    Je suis complètement embrouillé.

  6. #6
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    Citation Envoyé par diogene Voir le message
    i ne changera que lorsqu'on sera arrivé à np == NULL, pas avant.

    Normalement, c'est toi qui le sait. Mais alors, pourquoi cette boucle sur np ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for ( np = table[i] ; np != NULL ; np = np->next ) {
    ....
    strcpy(hashedbuff[i], np->name);

    De plus, pourquoi mes adresses sont-elles toutes différentes si l'adresse de départ est constemment écrasée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
             strcpy(hashedbuff[i], np->name);
             printf ( "%p-  %s", hashedbuff[i], hashedbuff[i] );
    ...
    hash: 195  00D540A8-  Every shared library has a special name called the ``soname''.
    hash: 340  00D540F0-  The key to managing shared libraries is the separation of these names.
    hash: 463  00D54140-  Car, il sera ok hah bomb adil.
    hash: 472  00D54168-  Avant que ce soit.
    hash: 806  00D54188-  The soname has the prefix ``lib'', the name of the.
    ...
     
    tableauIfie		00000000  (null)
    Donc i change, parce que les # de structures ne sont pas ordonnés. L'ordre est aléatoire. On doit donc trouver un 'premier' numéro. Ce 'premier' numéro n'est pas forcément le numéro que l'on a attribué à disons l'item [Avant que ce soit.] 472.

    472->next peut très bien être [Every shared library has a special name called the ``soname''.] 195

    Ce que je crois avoir démontré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf ( "==%s   ==%s", table[472]->name, table[195]->name);
    ==Avant que ce soit.     ==Every shared library has a special name called the ``soname''.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i ne changera que lorsqu'on sera arrivé à np == NULL, pas avant.
    Je ne crois pas que NULL teste le for. Le next doit mener à la structure suivante; pourquoi ne semble-t-il pas le faire? S'il le faisait, i ne serait pas incrémenté à moins que le next fasse le tour de toute la table de hashage 4 fois. Il ne le fait pas sinon j'aurais l'output des 4 lignes pour chaque table[i] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    195 Every shared library has a special name called the ``soname''.
    340 The key to managing shared libraries is the separation of these names.
    463 Car, il sera ok hah bomb adil.
    472 Avant que ce soit.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    La joie des pointeurs, encore plus.
    <...>
    Je nage toujours ...
    Ton code est incomplet.

    Que signifie 1024 ?
    Que vaut HASHSIZE ?
    Qu'est-ce que 'table' ?

    Faut-il faire plus compliqué que :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <strings.h>
     
    #define HASHSIZE (sizeof table /sizeof *table)
     
    struct nlist
    {
       struct nlist *next;
       char const *name;
    };
     
    int main (void)
    {
       size_t i;
       char *hashedbuff[1024] = { 0 };
     
       struct nlist c = { NULL, "ghi" };
       struct nlist b = { &c, "def" };
       struct nlist a = { &b, "abc" };
     
       struct nlist *table[] = {
          &a,
          &b,
          &c,
          NULL,
       };
       struct nlist *np;
       i = 0;
       for (np = table[i]; np != NULL; np = np->next)
       {
          hashedbuff[i] = strdup(np->name);
          printf ("tableauIfie[%u] = '%s'\n", (unsigned) i, hashedbuff[i]);
          i++;
       }
     
       return 0;
    }
    (à part libérer la mémoire). Quel est le but ?

  8. #8
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    C'est l'exemple de Kernigan et Ritchie 2ed frenchpage145 modifiée un peu.

    1024 nombre de pointeurs dans le tableau.
    #define HASHSIZE 850
    static struct nlist *hashtab[HASHSIZE];
    table est le paramètre pour recevoir *hashtab
    -------------
    Je compile le vôtre et j'ai des warnings:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ---------- GCC   -W -Wall -pedantic -mconsole -Wno-missing-braces  ----------
    hashtst.c: In function `main':
    hashtst.c:19: warning: initializer element is not computable at load time
    hashtst.c:20: warning: initializer element is not computable at load time
    hashtst.c:23: warning: initializer element is not computable at load time
    hashtst.c:24: warning: initializer element is not computable at load time
    hashtst.c:25: warning: initializer element is not computable at load time
     
    Output completed (0 sec consumed)

    J'obtiens quand même à l'exécution:
    tableauIfie[0] = 'abc'
    tableauIfie[1] = 'def'
    tableauIfie[2] = 'ghi'

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    C'est l'exemple de Kernigan et Ritchie 2ed frenchpage145 modifiée un peu.
    Tu parles des chapitre 6.6 ou 6.7 ?
    Je compile le vôtre et j'ai des warnings:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ---------- GCC   -W -Wall -pedantic -mconsole -Wno-missing-braces  ----------
    hashtst.c: In function `main':
    hashtst.c:19: warning: initializer element is not computable at load time
    hashtst.c:20: warning: initializer element is not computable at load time
    hashtst.c:23: warning: initializer element is not computable at load time
    hashtst.c:24: warning: initializer element is not computable at load time
    hashtst.c:25: warning: initializer element is not computable at load time
     
    Output completed (0 sec consumed)
    quick n'dirty fix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       static struct nlist c = { NULL, "ghi" };
       static struct nlist b = { &c, "def" };
       static struct nlist a = { &b, "abc" };

    J'obtiens quand même
    tableauIfie[0] = 'abc'
    tableauIfie[1] = 'def'
    tableauIfie[2] = 'ghi'
    est-ce le but recherché ?

  10. #10
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    6.6

    Je dois cesser de m'amuser pour quelques heures.

  11. #11
    Membre très actif Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Par défaut
    6.6

    C'est le but recherché mais je devrai le complexifier pour obtenir les possibilités de l'autre.

    Je vous quitte. À plus.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    6.6

    C'est le but recherché mais je devrai le complexifier pour obtenir les possibilités de l'autre.
    Quelle est la specification ? On ne complexifie pas par plaisir, mais uniquement si c'est nécessaire...

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

Discussions similaires

  1. IntPtr vers Tableau de structures
    Par Limuath dans le forum C#
    Réponses: 3
    Dernier message: 17/07/2007, 21h36
  2. [WD9] Fichier HF vers tableau mémoire
    Par Romanops dans le forum WinDev
    Réponses: 8
    Dernier message: 08/06/2006, 12h10
  3. changement de format lors d un lien vers tableau excel
    Par Lionel b dans le forum Access
    Réponses: 2
    Dernier message: 07/04/2006, 08h41
  4. convertion pointeur vers tableau
    Par gdpasmini dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2006, 00h34
  5. Réponses: 9
    Dernier message: 22/09/2005, 11h52

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