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 :

tableau de pointeurs void


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut tableau de pointeurs void
    Bonsoir tout le monde,

    je viens vous voir car j'ai déjà galéré plusieurs heures sur mon problème.

    Pour m'entrainer, je souhaite faire l'implémentation d'une pile sous la forme d'un tableau dynamique qui est vide au départ, et auquel j'alloue juste ce qu'il faut de mémoire à chaque ajout d'un nouvel élément. La mémoire qui n'est plus utilisée est libérée à chaque élément retiré de la liste.

    Les sources sont disponibles en fichiers attachés à ce post

    Les problèmes que je rencontre :
    ====================

    Premier Problème :
    --------------------------
    si j'ai une pile s avec des données dans le tableau et que je veux la VALEUR de l'élément du dessus de la pile, comment je fais ? J'ai essayé des trucs du genre :
    *stack_top(s)
    mais ca me donne toujours une erreur de ce type à la compilation (j'ai ce problème dans stack_afficher):
    stack.c:--: attention : dereferencing `void *` pointer
    stack.c:--: erreur: utilisation invalide d'expression void
    Deuxieme Problème :
    ------------------------------
    Lorsque je veux désallouer la mémoire de s->donnees, est ce que je peux juste faire un :
    Ou est-ce qu'il faut que je libère d'abord tous les pointeurs contenus dans s->donnees ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i=0 ; i++ ; i < s->taille){
        free(s->donnees[i])
    }
    Merci d'avance pour votre aide.


    Cordialement
    Fichiers attachés Fichiers attachés

  2. #2
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    Pour le prermier problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *stack_top(stack s);
    Voici le prototype de la fonction stack_top

    Donc il retourne un pointeur sur... un void, c'est à dire aucun type précis.

    Le compilo ne sait donc pas comment "déréférencer" la valeur pointée, c'est à dire comment interpréter le bout de mémoire pointé. ça pourrait etre un int, un char, une struct...

    bref telle quelle l'opération n'a pas de sens.

    à la limite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void * elemDuDessus = stack_top(s);
    pour juste récupérer le pointeur.

    Mais tu ne peux toujours rien en faire tant que tu ne connais pas le type qui se cache derriere (y'a qqchose dans la FAQ à ce sujet, recherche "void" dans la FAQ C).


    Ensuite quand tu connais le type il faut l'indiquer :
    par exemple si tu sais que c'est un "int" tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int pointeurSurInt * = NULL;
    (...)
    pointeurSurInt = stack_top(s);
    Là, si je ne me trompe pas , le compilateur fait une conversion implicite (toujours possible depuis void *)

    tu peux ensuite déréférencer pointeurSurInt ( *pointeurSurInt ) pour utiliser le int pointé.

    int resultat;
    ....
    resultat = 10 + 100 * (*pointeurSurInt) - 3 * 3 * 5;
    à adapter pour chaque type.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Ok, merci pour ta réponse Pacorabanix. J'ai compris mon erreur.

    Donc le premier problème est résolu.

    Je chercherai plus demain pour le second problème (désallocation d'un tableau de pointeur, ou d'un élément d'un tableau de pointeur).

    Bonne nuit,

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par CerbeRGD Voir le message
    Deuxieme Problème :
    ------------------------------
    Lorsque je veux désallouer la mémoire de s->donnees, est ce que je peux juste faire un :
    Ou est-ce qu'il faut que je libère d'abord tous les pointeurs contenus dans s->donnees ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i=0 ; i++ ; i < s->taille){
        free(s->donnees[i])
    }
    Ca dépend : s->donnees[i] sont des pointeurs. Si les objets pointés ont été obtenus par allocation dynamique, il faut le faire (à moins quune copie de leur adresse soit gardée ailleurs et que la libération soit faite ailleurs), sinon, leur adresse sera perdue lors du free(s->données) et on ne pourra jamais libérer la mémoire.

    Dans l'exemple de ton main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        int a=15;
        stack_push(s, &a);
    il ne faut absolument pas le faire : a n'a pas été créé par allocation dynamique.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Si les objets pointés ont été obtenus par allocation dynamique, il faut le faire
    Je ne vois pas exactement ce qu'est un objet obtenu par allocation dynamique. Ca serait quelque chose comme ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type* a=malloc( sizeof(*type) );
    En supposant que c'est bien ca un objet alloué dynamiquement, comme je ne peux pas deviner quel sera le type d'objets stocké dans la pile, il me semblerait plus sage d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i=0 ; i++ ; i< s->taille){
        free(s->donnees[i]);
    }
    Qu'en pensez vous?

    Cordialement

  6. #6
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par CerbeRGD Voir le message
    Je ne vois pas exactement ce qu'est un objet obtenu par allocation dynamique. Ca serait quelque chose comme ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type* a=malloc( sizeof(*type) );
    En supposant que c'est bien ca un objet alloué dynamiquement, comme je ne peux pas deviner quel sera le type d'objets stocké dans la pile, il me semblerait plus sage d'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (int i=0 ; i++ ; i< s->taille){
        free(s->donnees[i]);
    }
    C'est bien ça. Ce n'est pas sage du tout de faire ce free dans le doute car si l'objet n'a pas été alloué dynamiquement, le programma plante.
    Tu dois décider si tes objets sont alloués dynamiquement ou pas. ça dépend de ton application.
    Attention :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type* a=malloc( sizeof(type) );
    ou
    type* a=malloc(sizeof *a );
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    C'est bien ça. Ce n'est pas sage du tout de faire ce free dans le doute car si l'objet n'a pas été alloué dynamiquement, le programma plante.
    Tu dois décider si tes objets sont alloués dynamiquement ou pas. ça dépend de ton application.
    Ok je vois. Donc une solution serait que, dans le programme qui utilise cette implémentation de pile, on désalloue ou pas les variables contenues dans "s->donnees" (en fonction de si elles sont allouées dynamiquement ou pas). Et que ensuite seulement on désalloue le tableau avec un :
    Une dernière chose et je vous laisse tranquille

    Je ne suis pas sur d'avoir bien compris ce que tu voulais dire par :
    Attention :
    type* a=malloc( sizeof(type) );
    ou
    type* a=malloc(sizeof *a );
    Ces deux expressions sont bien équivalentes ?


    Merci de ton aide et de ta patience diogene.

  8. #8
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par CerbeRGD Voir le message
    Ok je vois. Donc une solution serait que, dans le programme qui utilise cette implémentation de pile, on désalloue ou pas les variables contenues dans "s->donnees" (en fonction de si elles sont allouées dynamiquement ou pas). Et que ensuite seulement on désalloue le tableau ...
    Et comment sauras-tu si les objets ont été alloués dynamiquement ou non ?


    Les deux lignes de code sont équivalentes mais la seconde est souvent préférée. Je les ai mentionnées comme correction à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type* a=malloc( sizeof(*type) );
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    désolé pour le délai de réponse...

    Et comment sauras-tu si les objets ont été alloués dynamiquement ou non ?
    Pour illustrer mes suppositions, j'ai écrit des exemples d'utilisation de la pile, avec des commentaires (voir les fichiers attachés).

    Es-tu d'accord avec les commentaires que j'ai mis dans les exemples?
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Es-tu d'accord avec les commentaires que j'ai mis dans les exemples?
    Oui
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Oui
    Super, il semblerait que j'ai bien compris .
    Merci beaucoup pour ton aide, Diogene. Tu m'as bien aidé à comprendre ces histoires d'allocation dynamique.

    Bonne continuation

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

Discussions similaires

  1. pointeur de tableau pour fonction void
    Par giovedy dans le forum C
    Réponses: 4
    Dernier message: 01/08/2012, 18h18
  2. Tableau de pointeurs sur objets
    Par bassim dans le forum C++
    Réponses: 11
    Dernier message: 13/12/2005, 19h45
  3. [GCC] Tableau de pointeurs pour accès multiples en asm
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 12/12/2005, 08h47
  4. tableau de pointeurs
    Par seal3 dans le forum C++
    Réponses: 7
    Dernier message: 01/11/2005, 20h51
  5. Tableau de pointeurs de fonctions
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 29/10/2005, 13h19

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