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 :

initialiser une struc pointant sur une struct


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut initialiser une struc pointant sur une struct
    Bonjour,

    J'essaye d'initialiser une structure pointant elle même sur une structure. Je ne maitrise pas vraiment ce genre de truc et je ne m'y prends pas comme il faut.
    voici mon code:
    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
    #include "malloc.h"
    #include "stdio.h"
     
     
     
    typedef struct
    {
    //	int number;
    	int size;
    	unsigned int *string_;
    }str;
     
    typedef struct
    {
    	str *zero;
    	str *one;
    	str *two;
    	str *three;
    	str *four;
    	str *five;
    	str *six;
    }Id_str;
     
     
     
     
    void chaine ()
    {
    str ch; 
    Id_str Id_ch;
     
    Id_ch.zero->size = 36;
    Id_ch.one->size = 36;
    Id_ch.two->size = 32;
    Id_ch.three->size = 27;
    Id_ch.four->size = 32;
    Id_ch.five->size = 32;
    Id_ch.six->size = 40;
     
     
     
    Id_ch.zero->string_ = (unsigned int *) malloc (sizeof(unsigned int) * Id_ch.zero->size);
    if (Id_ch.zero->string_ == NULL) 
    	{
        fprintf(stderr,"Allocation Id_ch.zero->string_ impossible \n");
    //    exit(EXIT_FAILURE);
    	}
     
    //Id_ch.zero->string_ = {32,48,49,50,51,52,53,54,55,56,57,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};
    Id_ch.zero->string_[Id_ch.zero->size] = {32,48,49,50,51,52,53,54,55,56,57,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};
    //Id_ch.zero->string_[0]=0;
     
     
    };
    Je crois bien qu'il faut que j'initialise str à quelque chose, mais je sais pas vraiment quoi?

    L'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Id_ch.zero->string_[0]=0;
    fonctionne, mais pas le reste.

    De plus je voudrais me servir de ces structures dans un autre programme, est ce que si j'inclus tout ça, je pourrais y accéder??

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Je peux toujours initialiser un tableau contenant toutes les valeurs que je veux, et assigner le pointeur dessus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned int tab1[37] = {32,48,49,50,51,52,53,54,55,56,57,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};
    Id_ch.zero->string_ = tab1;
    mais je trouve cette solution pas elegante, car je souhaite optimiser la taille du programme

    quelqu'un sait comment faire??

  3. #3
    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 Re: initialiser une struc pointant sur une struct
    Citation Envoyé par gronaze
    J'essaye d'initialiser une structure pointant elle même sur une structure.
    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
     
    typedef struct
    {
    //	int number;
    	int size;
    	unsigned int *string_;
    }str;
     
    typedef struct
    {
    	str *zero;
    	str *one;
    	str *two;
    	str *three;
    	str *four;
    	str *five;
    	str *six;
    }Id_str;
    Le principe est simple. Un pointeur doit être initialisé avant d'être utilisé.

    On commence par définir un objet de type Id_str :
    ensuite, chaque élément doit être initialisé :
    etc.
    Il faut donc au préalable définir zero, un etc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    str zero;
    str un;
    str deux;
    str trois;
    str quatre;
    str cinq;
    str six;
    On peut donc maintenant ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    a.zero = &zero;
    a.un = &un;
    a.deux = &deux;
    a.trois = &trois;
    a.quatre = &quatre;
    a.cinq = &cinq;
    a.six = &six;
    A partir du moment où zero, un etc. sont définis, on peut les initialiser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    zero.number = 0;
    zero.size = 36
    zero.string_ = "zero";
     
    un.number = 1;
    un.size = 36;
    un.string_ = "one";
    etc.
    On peut aussi initialiser les variables au moment de la définition (valeurs arbitraires pour l'exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    str zero = {0, 36, "zero"};
    str un = {1, 36, "one"};
    str deux = {2, 32, "two"};
    etc.
    Id_str a = {&zero, &un, &deux etc.};
    D'une façon plus générale, on peut se demander pourquoi avoir choisi une structure de pointeurs de structures. Etand donné qu'on a affaire à des données de même types, le tableau semble plus indiqué...
    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
     
    enum
    {
       ZERO,
       UN,
       DEUX,
       TROIS,
       QUATRE,
       CINQ,
       SIX,
       NB
    };
     
    typedef struct
    {
       int number;
       int size;
       unsigned int *string_;
    }
    str;
     
    typedef struct
    {
       str *a[NB];
    }
    Id_str;
    On peut aussi se demander pourquoi des pointeurs... On peut aussi faire un tableau directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <...>
    typedef struct
    {
       str a[NB];
    }
    Id_str;
    Quand à la structure, est-elle bien utile ?
    Ce qui peut s'initialiser ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    str a[NB]=
    {
       {0, 36, "zero"},
       {1, 36, "one"},
       {2, 32, "two"},
       <etc.>
    };
    Personnellement, je vais au plus simple...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    merci pour la réponse.

    j'ai tripatouillé de mon coté et en appliquant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ch.size = 37;
    ch.string_ = NULL;
    ch.string_ = tab1;
    Id_ch.zero = (str *) malloc (sizeof( ch) );
     
     
    Id_ch.zero->size = ch.size;
    Id_ch.zero->string_ = *(&tab1);
    j'arrive à mon résultat.

    Je vais regarder ce que tu m'as écrit.

  5. #5
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Juste sur la dernière partie de ce que tu viens de poster et notament cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Id_ch.zero = (str *) malloc (sizeof( ch) );
    Il est maintenant de moins en moins utile de "caster" les retours de malloc. J'ai regardé ton code du début et j'ai vu que tu testais le retour de malloc, ici tu ne l'as pas fait , j'espère que c'est juste parce que tu voulais incister sur certaines choses parce qu'il faut toujours tester les retours de fonctions système.

    Concernant l'opérateur sizeof, il existe deux utilisations :

    et

    Dans ton cas, ch est une expression et pas un type, utilise donc la version sans parenthèse.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    merci,

    oui je teste à chaque fois mes malloc. Sinon j'ai essayé de faire un tableau, et ça marche plutôt bien.

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

Discussions similaires

  1. [9.1] Gérer une FK pointant sur une PK de type SERIAL
    Par Marine_Arctica dans le forum Débuter
    Réponses: 9
    Dernier message: 02/07/2013, 17h40
  2. Pb sur une requête DELETE sur une chaine
    Par astrolane dans le forum Sybase
    Réponses: 4
    Dernier message: 16/02/2009, 09h11
  3. Réponses: 9
    Dernier message: 07/02/2008, 16h42
  4. Réponses: 3
    Dernier message: 25/10/2007, 11h47

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