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 :

Déclaration d'une structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Déclaration d'une structure
    comment déclarer une structure (un type) en c définit par;
    une chaine de caractères
    la longueur de cette chaine
    taille de l'espace alloué pour contenir la chaine

  2. #2
    Membre averti Avatar de Neroptik
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 337
    Points : 402
    Points
    402
    Par défaut
    Bonjour,

    Voila comment declarer une structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct     ma_struct
    {
    char       *ma_chaine;
    int        size;
    };
     
    typedef struct ma_struct mon_type;
    Voila, le typedef permet d'avoir un genre d'alias pour la structure. Lorsque tu declerera une variable du type de ta structure tu pourra ecrire ceci :

    La taille (en octets) que prendra ta chaine en memoire sera la meme que sa size puisqu'un char prend un octet (0 a 255).

    Cordialement,
    Neroptik

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Mais dans ce cas, machaine doit pointer sur une chaîne de caractères, et non contenir une chaîne de caractères. size contiendra la taille en octets (bytes) du bloc pointé.

    Je propose par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct {
        char s[50];
        size_t longueur, capacite;
    } st_chaine ;
     
    ...
     
    st_chaine ch;
    ch.capacite = 50; /* ou ch.capacite = sizeof(ch.s); */
    strcpy(ch.s, "abc");
    ch.longueur = 3; /* ou ch.longueur = strlen(ch.s); */

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
        char s[50];
        size_t longueur, capacite;
    } st_chaine ;
    berk !

    Et quid si la chaine depasse 50

    Pourquoi ne pas garder un pointeur ?
    C'est beaucoup plus souple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
        char *s;
        size_t longueur, capacite;
    } st_chaine ;
    a l'initialisation on fait un calloc de s d'une taille utille que l'on met dans capacité

    Ensuite s devient dynamique et rien n'empeche de faire un realloc
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Points : 288
    Points
    288
    Par défaut
    La proposition de melem est bien moins dangereuse :
    * moins de risques de segfaults dues à :
    * * un oubli d'allocation
    * * un free d'un buffer partagé par deux structs alors qu'une des structs l'utilise encore
    * modification d'une struct qui entraîne une modification non prévue d'une autre
    * fuites de mémoire

    Après tout dépend de ce que l'on veut faire, si :
    * on a des chaînes de longueur imprévisible
    * on veut calculer la mémoire au plus juste
    * on a beaucoup de ces structs utilisées dans le programme
    * on veut pouvoir partager les chaînes de caractères entre plusieurs structs
    Alors ok pour le pointeur et malloc/realloc. Mais c'est pas la solution la plus simple à mettre en oeuvre.
    Sinon y'a aussi la solution en C99 de déclarer la struct ainsi (chaîne en fin de struct) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct une_struct {
        type un_champ;
        char ma_chaine[];
    }
    et de décider de la taille du tableau à l'allocation. C'est un entre deux, moins souple que ta solution olibara, plus que celle de melem, mais qui impose de ne pas s'emmêler les pinceaux avec la taille du tableau imprévisible.

    [Edit] J'oubliais, la solution de melem a l'avantage de permettre de s'affranchir complètement de l'allocation dynamique, suivant le cas... Ça peut être un sacré avantage !
    [Edit2] chapines == chaînes; Elle m'énerve cette faute de frappe, elle m'énerve !!!

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    @huit_six : bien vu. La question venant d'un débutant, il faut savoir donner des réponses accessibles à tout débutant, pas des réponses d'expert à expert. Si l'apprenti fait preuve de plus de curiosité, c'est la seulement qu'il faut l'initier à quelques trucs avancés. C'est une méthode d'enseignement largement utilisée.

  7. #7
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Melem

    Il voulait avoir

    une chaine de caractères
    la longueur de cette chaine
    taille de l'espace alloué pour contenir la chaine
    Quand on parle de l'espace alloué il doit y avoir une raison

    Dans ton exemple, définir la capacité ne sert a rien puisqu'elle est implicitement connue dans le sizeof de s

    Pire ca complique les chose puisque dans ton exemple il est necessaire de l'assigner en redondance avec le sizeof(s) alors que vous revendiquez la simplicité

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
        char s[50];
        size_t longueur, capacite;
    } st_chaine ;
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par olibara
    Quand on parle de l'espace alloué il doit y avoir une raison
    Il y a un abus de langage dans ce que t'es en train de dire. Alloué ne signifie pas forcément "alloué dynamiquement" ! Si je déclare par exemple une variable char x, alors la taille allouée pour ma variable x est 1 byte. C'est tout.

    Citation Envoyé par olibara
    Dans ton exemple, définir la capacité ne sert a rien puisqu'elle est implicitement connue dans le sizeof de s

    Pire ça complique les chose puisque dans ton exemple il est nécessaire de l'assigner en redondance avec le sizeof(s) alors que vous revendiquez la simplicité
    Ca c'est en partie en vrai, et je ne suis pas contre la solution char * + malloc d'ailleurs. Par contre, je pense que même avec un tableau statique, avoir un champ capacite dans st_chaine ne complique rien du tout car écrire machaine.capacite, c'est quand même plus sympa qu'écrire sizeof(machaine.s) non ?

    En fait, le véritable problème est que le sujet n'a pas précisé si on veut avoir un tableau dynamique ou juste un tableau statique. Logiquement, ça devrait être la première sinon le champ capacite n'aurait évidemment pas une réelle raison d'être. On peut aussi cependant croire que c'est juste un mauvais exercice de manipulation de structure, et non un exercice de manipulation des chaînes ...

  9. #9
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    machaine.capacite, c'est quand même plus sympa qu'écrire sizeof(machaine.s) non ?
    Certe ! et je suis tres friand de lisibilité

    Neanmoins dans le cadre ou huit_six parlait du risque d'oubli en tout genre, ca nécessite de ne pas oublier d'assigner la capacité et de ne pas se tromper !

    avec un sizeof aucun risque
    Et on gagne de la place
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/10/2013, 17h42
  2. Déclaration d'une structure
    Par ALX79 dans le forum Débuter
    Réponses: 7
    Dernier message: 24/03/2011, 02h33
  3. déclaration/initialisation d'une structure
    Par boboss123 dans le forum C
    Réponses: 8
    Dernier message: 22/09/2010, 17h05
  4. Réponses: 2
    Dernier message: 20/06/2010, 17h02
  5. Déclaration de vector dans une structure
    Par nicoesenlamierda dans le forum Langage
    Réponses: 1
    Dernier message: 26/08/2009, 16h15

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