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 averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 23
    Par défaut Déclaration d'une structure
    Bonjour,

    Dans le cadre d'un projet JAVA je dois m'interfacer avec du C. Le soucis c'est que je ne suis pas sur de bien comprendre la déclaration d'une structure ...

    typedef struct GFT_SessionHandle_ {} * GFT_SESSION_HANDLE;
    Est-ce que cela veut dire que GFT_SESSION_HANDLE est un pointeur sur une structure vide ?

    Merci de m'aiguiller.... je n'ai que de trés bréve notion de c.

    Merci, Alexandre

  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
    GFT_SESSION_HANDLE serait un type "adresse d'une structure struct GFT_SessionHandle_ " qui en l'occurrence ne comporterait aucun membre.
    Quel intérêt ?

    De plus je crois qu'il n'est pas légal de déclarer un type struct vide :

    n1256 :
    6.2.5 Types
    ....
    20
    ....
    — A structure type describes a sequentially allocated nonempty set of member objects (and, in certain circumstances, an incomplete array), each of which has an optionally specified name and possibly distinct type.

    6.7.2.1 Structure and union specifiers
    ....
    7 The presence of a struct-declaration-list in a struct-or-union-specifier declares a new type, within a translation unit. The struct-declaration-list is a sequence of declarations for the members of the structure or union. If the struct-declaration-list contains no named members, the behavior is undefined. The type is incomplete until after the } that terminates the list.
    Peut-être, on voulait déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct GFT_SessionHandle_  * GFT_SESSION_HANDLE;
    où struct GFT_SessionHandle_ est un type incomplet (dont la définition n'est pas encore connue)

  3. #3
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    une question,
    declarer une structure dont la definition n'est pas connu me permettrait il de pouvoir renvoyer plusieurs stucture differente? j'explique avec un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct A
    {
        char *a;
        char *b;
        char *c;
    } A;
    struct B
    {
       char *a;
    }B;
     
    typedef struct ss SS;
    et donc ecrire une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SS* func(int t)
    {
        if(t==0)
            ...creation,initialisation et renvois de A
        if(t==1)
           ....creation ,initialisation et renvois de B
    }
    et dans le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(void)
    {
        struct B* b = func(1);
        struct A* a = func(0);
     
        ...utilisation ...
        release(&b,1);
        release(&a,0);  //ou l'argument 0 est de type SS
     
        return EXIT_SUCCESS;
    }
    ce code est-il legal? propre? conporte t'il un probleme?
    merci

  4. #4
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Citation Envoyé par diogene Voir le message
    De plus je crois qu'il n'est pas légal de déclarer un type struct vide :

    n1256 : ...
    Tous les compilateurs que je connais l'autorisent, mais font aussi en sorte que la taille d'une structure / classe vide soit non nulle (= sizeof(char)) afin de respecter la règle stipulant que deux objets distincts possèdent deux adresses distinctes.

  5. #5
    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
    @lilington
    declarer une structure dont la definition n'est pas connu me permettrait il de pouvoir renvoyer plusieurs stucture differente? j'explique avec un exemple ....
    Dans ton exemple, il s'agit de manipuler des pointeurs sur structures où le type exact de la structure est "flou". Un pointeur void * est fait pour cela. Pour reprendre ton exemple, cela donne :
    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
    void* func(int t)
    {
      struct A * a = malloc(sizeof *a);
      struct B * b = malloc(sizeof *b);
      return t==0? a : b;
    }
    void release(void* s)
    {
      free(s);
    }
    int main(void)
    {
        struct B* b = func(1);
        struct A* a = func(0);
     
     //   ...utilisation ...
        release(b);
        release(a);
        return EXIT_SUCCESS;
    }

  6. #6
    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
    Citation Envoyé par Chatanga Voir le message
    Tous les compilateurs que je connais l'autorisent, mais font aussi en sorte que la taille d'une structure / classe vide soit non nulle (= sizeof(char)) afin de respecter la règle stipulant que deux objets distincts possèdent deux adresses distinctes.
    Oui, et cela me semble en contradiction avec le texte de la norme (ou quelque chose m'a échappé). S'agit-il d'une extension courante ?
    C'est pourquoi ma réponse n'était pas totalement catégorique
    De plus je crois qu'il n'est pas légal de déclarer un type struct vide
    Si quelqu'un a des explications, je suis preneur.

    Par contre un compilateur C ANSI ne l'admettra certainement pas.

  7. #7
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Citation Envoyé par diogene Voir le message
    Oui, et cela me semble en contradiction avec le texte de la norme (ou quelque chose m'a échappé). S'agit-il d'une extension courante ?
    C'est pourquoi ma réponse n'était pas totalement catégorique


    Si quelqu'un a des explications, je suis preneur.

    Par contre un compilateur C ANSI ne l'admettra certainement pas.
    Après quelques recherches, la réponse est que c'est interdit en C mais permis en C++ (avec certaines subtilités d'implémentation). On en apprend tous les jours !

  8. #8
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    en faite c'etait pour savoir si justement on pouvait se passer de void en faisant cette petite gym. mais j'ai pas precise sans utiliser void.
    sinon merci

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/10/2013, 17h42
  2. déclaration/initialisation d'une structure
    Par boboss123 dans le forum C
    Réponses: 8
    Dernier message: 22/09/2010, 17h05
  3. Réponses: 2
    Dernier message: 20/06/2010, 17h02
  4. Déclaration d'une structure
    Par grodashe dans le forum C
    Réponses: 8
    Dernier message: 17/12/2009, 12h57
  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