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 :

[VOID*] Implémentation stockage de structures différentes


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 142
    Points : 127
    Points
    127
    Par défaut [VOID*] Implémentation stockage de structures différentes
    Bonjour,

    Je souhaite créer une structure contenant deux élements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct _cont {
    	int nbElement;
    	void *tab;
    } Container;
    afin de stocker toute sorte d'autres structures (du même type par instance de Container).

    Pour cela j'aimerais pouvoir utiliser la même fonction d'ajout pour n'importe quelle structure à ajouter.

    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
     
    int putInContainer(Container *container, void *element) {
    	if (!container || !element) {
    		return KO;
    	}
    	/* allocation (je suis vraiment pas sûr pour le sizeof...) */
    	void *tmp = realloc(container->tab, sizeof(element) * (container->nbLine + 1));
    	if (tmp) {
    		container->tab = tmp;
    	} else {
    		/* erreur allocation mémoire */
    		return KO;
    	}
    	/* affectation qui fonctionne pas vraiment */
    	container->tab[container->nbLine] = element;
       container->nbLine++;
    	return OK;
    }
     
    int main() {
    	Container *co = malloc(sizeof(Container));
    	co->nbLine = 0;
    	co->tab = NULL;
     
    	if (putInContainer(co, pointeur_sur_structure) {
    		printf("pb\n");
    		exit(1);
    	}
     
    (...)
    Bon déjà ce code ne compile pas en utilisant une véritable structure à stocker

    J'ai un problème pour l'allocation, en principe sizeof prend en paramètre un type de donnée il me semble,
    et un problème pour l'affectation, je ne sais pas trop comment m'y prendre


    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Points : 451
    Points
    451
    Par défaut
    Salut !

    Déjà, c'est un oubli sur le post ou dans ton code le fait que tu demandes un container->nbLine alors que nbLine n'existe pas dans ta structure ??

    Ensuite, si j'ai bien compris, tu gardes void car tu souhaites spécialiser le type après ? Je ne connais pas de solution élégante en C (en C++ c'est beaucoup plus facile avec les template et tout ce genre d'outils), mais pourquoi ne pas passer en paramètres le type de element ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define TRUC 0
    #define BIDULE 1
    ...
     
    #define SIZEOF_TRUC 8
    #define SIZEOF_BIDULE 16
    ...
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int putInContainer(Container *container, void *element, int SIZEOF_TYPE) {
       if (!container || !element) {
          return KO;
       }
     
       tmp = realloc(container->tab, sizeof(SIZEOF_TYPE)) * (container->nbLine + 1));
     
    ...
    }
    puis des switch dans ton main en fonction du type ??

    Bon je sais c'est pas génial, mais c'est sans doute l'une des limites du C non ?

    [EDIT] Au fait, ta structure stocke des types différents d'un point de vue global (cad dans container il y a du TRUC seulement), ou directement dedans (cad dans container il y a du TRUC, du BIDULE, du MACHIN)...

    Parce que dans le cas 2, tu devrais utiliser les listes chaînées, c'est je pense le seul moyen... Et là tu peux chaîner tout ce que tu veux...

    A+
    "Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 142
    Points : 127
    Points
    127
    Par défaut
    Merci de ta réponse, en effet je pense que la solution reste assez alambiquée, ce qui ne me convient pas, faut pas que je transforme le code en usine à gaz.

    De plus comme tu dis l'utilisation du type void m'empêche d'utiliser un indicateur de tableau type tab[i], ce qui rend la chose encore moins élégante...

    Les listes chainées... je vais me pencher sur cette option

    en tout cas merci
    A+
    Ciao

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Regarde pour une liste chaînée générique, double ou simple, c'est suivant ton utilisation ! Générique du fait que tu veut stocker différentes structures qui ne sont pas identiques !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    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: [VOID*] Implémentation stockage de structures différente
    Citation Envoyé par tomasha
    Je souhaite créer une structure contenant deux élements <...>
    Bon, et à part me réveiller pendant ma sieste, on est censé faire quoi avec ça ?
    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
     
    Compiling: main.c
    main.c:6: warning: no previous prototype for 'putInContainer'
    main.c: In function `putInContainer':
    main.c:8: error: `KO' undeclared (first use in this function)
    main.c:8: error: (Each undeclared identifier is reported only once
    main.c:8: error: for each function it appears in.)
    main.c:11: error: implicit declaration of function `realloc'
    main.c:11: warning: nested extern declaration of `realloc'
    main.c:11: error: structure has no member named `nbLine'
    main.c:11: warning: initialization makes pointer from integer without a cast
    main.c:19: error: structure has no member named `nbLine'
    main.c:20: error: structure has no member named `nbLine'
    main.c:21: error: `OK' undeclared (first use in this function)
    main.c: In function `main_':
    main.c:25: error: implicit declaration of function `malloc'
    main.c:25: warning: nested extern declaration of `malloc'
    <internal>:0: warning: redundant redeclaration of 'malloc'
    main.c:26: error: structure has no member named `nbLine'
    main.c:27: error: `NULL' undeclared (first use in this function)
    main.c:29: error: `pointeur_sur_structure' undeclared (first use in this function)
    main.c:29: error: syntax error before '{' token
    main.c:31: error: implicit declaration of function `exit'
    main.c:31: warning: nested extern declaration of `exit'
    <internal>:0: warning: redundant redeclaration of 'exit'
    main.c: At top level:
    main.c:34: error: syntax error before '}' token
    main.c:34:2: warning: no newline at end of file
    Process terminated with status 1 (0 minutes, 0 seconds)
    Pas de Wi-Fi à la maison : CPL

  6. #6
    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
    Citation Envoyé par CSoldier
    Regarde pour une liste chaînée générique, double ou simple, c'est suivant ton utilisation ! Générique du fait que tu veut stocker différentes structures qui ne sont pas identiques !
    Oui, enfin, on ne stocke que l'adresse...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par CSoldier
    Regarde pour une liste chaînée générique, double ou simple, c'est suivant ton utilisation ! Générique du fait que tu veut stocker différentes structures qui ne sont pas identiques !
    Oui, enfin, on ne stocke que l'adresse...
    Oui biensur, ca coule de source ... enfin pour moi, mais c'est vrai qu'il faut que je fasse attention sur comment j'écrit
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 142
    Points : 127
    Points
    127
    Par défaut Re: [VOID*] Implémentation stockage de structures différente
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par tomasha
    Je souhaite créer une structure contenant deux élements <...>
    Bon, et à part me réveiller pendant ma sieste, on est censé faire quoi avec ça ?

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/09/2007, 07h28
  2. Vue sur 2 tables de structures différentes
    Par thesmall dans le forum Langage SQL
    Réponses: 7
    Dernier message: 08/08/2007, 21h18
  3. Réponses: 1
    Dernier message: 17/03/2007, 20h32
  4. Insérer données dans structure différente
    Par guigui11 dans le forum Access
    Réponses: 2
    Dernier message: 18/09/2006, 16h31
  5. fusionner 2 tables de structure différente
    Par Rcanada dans le forum Access
    Réponses: 9
    Dernier message: 21/04/2006, 09h54

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