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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 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 chevronné 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
    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 confirmé
    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 : 39
    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
    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 expérimenté
    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
    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

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    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 confirmé
    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 : 39
    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
    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.

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