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 :

Pile sans type


Sujet :

C

  1. #1
    Nouveau membre du Club

    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 32
    Points : 36
    Points
    36
    Par défaut Pile sans type
    Bonsoir,
    J'ai besoin pour un projet de pouvoir créer une Pile.
    Jusque là je n'ai pas de soucis, j'ai créé une pile de Double.

    Mais je voudrais pouvoir créer une pile sans que ces valeurs ai un type défini.
    Je voudrais pouvoir créer une pile de Double, de Char, ou de Int par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct elemPile
    {
    	XXX val;
    	struct elemPile* suivant;
    }element;
     
    typedef struct caracPile
    {
    	int nbElem;
    	element* debut;
    }pile;
    Voilà la structure de ma pile. On m'a dit que la valeur devait prendre le type "void *", mais je ne sais pas comment m'en sortir dans la gestion de cette variable dans le programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void ajouterElem(pile *p, xxx d)
    {
    	element *e;
    	e = (element *)malloc(sizeof(xxx));
    	e->val = d;
    	e->suivant = p->debut;
    	p->debut = e;
    	p->nbElem++;
    }
    Et voilà ma fonction d'insertion dans la pile.
    Pourriez vous m'indiquer les modification à faire sur ces deux bouts de code pour qu'il fonctionne sans type prédéfini ? Cela m'avancerai beaucoup.

    Merci d'avance, et désolé pour le coté un peu brouillon.

  2. #2
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonsoir,
    En effet, le meilleur moyen est de remplacer tous tes XXX par void *.
    Et pour allouer un élément, c'est toujours malloc(sizeof(elemPile)).

    Si l'allocation/la libération des données est gérée hors de la pile, alors ça suffit.
    Sinon, c'est un peu plus compliqué.

    Le problème, c'est qu'à partir du type void *, il est impossible de déterminer la taille des données pointées.
    C'est pourquoi il faut passer en paramètre la taille de ces données (comme la plupart des fonctions de la bibliothèque standard qui prennent un void * en paramètre).

    Et alors ça donnerait quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void ajouterElem(pile *p, void *d, size_t taille)
    {
    	element *e;
    	e = (element *) malloc(sizeof(element));
    	e->val = malloc(taille);  /* Allocation de la mémoire pour les données de l'élément de pile */
            memcpy(e->val, d, taille); /* Copie des données */
    	e->suivant = p->debut;
    	p->debut = e;
    	p->nbElem++;
    }
    Bien sûr, dans ce cas-là il faut penser à libérer la mémoire à la suppression des éléments.

  3. #3
    Nouveau membre du Club

    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 32
    Points : 36
    Points
    36
    Par défaut
    Merci beaucoup, c'est exactement le genre de réponse que j'attendais
    Je teste ça sur le champ.

    J'ai une autre petite question, pour afficher une variable de type void*, il existe une solution simple, ou je dois absolument connaitre le véritable type ?

  4. #4
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Les données brutes ne sont pas interprétées de la même manière selon le type désiré.
    Il te faut donc connaître le type réel des données.

    Un petit exemple pour te convaincre :
    (sur mon système, sizeof(int) == sizeof(float))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
     
    int main()
    {
        int n = 3;
        printf("%g\n", *(float *) &n);
        return 0;
    }

  5. #5
    Nouveau membre du Club

    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 32
    Points : 36
    Points
    36
    Par défaut
    C'est parfait, merci à toi

    BOnne journée.

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

Discussions similaires

  1. Input de type File sans le champ ?
    Par DemonKN dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 11/02/2010, 13h59
  2. Création d'une pile sans pointeurs
    Par JonesKey dans le forum Débuter
    Réponses: 3
    Dernier message: 29/11/2009, 17h27
  3. Appel DCOM dynamique - sans type library
    Par gside dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 27/03/2009, 14h43
  4. [architecture] Choix du type de pile
    Par Neitsa dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 29/11/2005, 10h04
  5. [HTML] Lien submit sans input de type submit
    Par escafr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 24/11/2005, 10h57

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