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 :

Fonctions génériques en C et types


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Par défaut Fonctions génériques en C et types
    Bonjour à tous,

    Je suis entrain d'écrire une petite bibliothèque à usage personnel contenant une structure de liste générique accompagnée de fonctions permettant diverses manipulations.

    Tout d'abord voici le type tel que je l'ai défini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct Lst Lst ;
    struct Lst {
      void* elt ;
      Lst* suivant ;
    } ;
    Je cherche à écrire l'équivalent de la fonctionnelle iter du langage OCaml (qui permet d'appliquer une fonction sans retour à tous les éléments de la liste) dont voici le code tel que je l'ai écris dans ma bibliothèque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void iter_Lst (Lst* lst, void (*fun) (void*)) {
      for (lst ; lst ; lst = lst->suivant)
        (*fun) (lst->elt) ;
    }
    Pour essayer je souhaite maintenant créer une liste contenant des pointeurs vers des entiers et utiliser ma précédente fonction pour en afficher les éléments un à un. Je définis donc une fonction d'affichage toute simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void afficher (int* a) {
      printf ("%d ", *a) ;
    }
    Que j'appelle ensuite comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iter_Lst (lst, &afficher) ;
    Ça marche (j'ai bien le contenu de la liste qui s'affiche à l'écran) mais le compilateur (gcc) me rapporte deux avertissements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lst.c:71:3: attention : passing argument 2 of ‘iter_Lst’ from incompatible pointer type [enabled by default]
    lst.c:51:6: note: expected ‘void (*)(void *)’ but argument is of type ‘void (*)(int *)
    Je comprend ces avertissements (logique car comme j'ai décidé de faire une liste de pointeurs sur entier ma fonction d'affichage prend un pointeur sur entier) mais j'aimerai savoir si il est possible de ne plus les avoir, car tant que je respecte les types sur lesquels je travaille ma fonction marche sans encombre.
    De plus, le pointeur void* étant générique pourquoi un avertissement est-il produit lorsque j'utilise un autre type ?

    Merci d'avance pour vos éclaircissements...

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    tu as plusieurs solutions à ta disposition.



    En ce qui concerne l'explication du warning : il ne râle pas sur une utilisation inappropriée du type void * mais sur le type (qui n'est pas un void *) void (*fun) (void*) qui est différent du type void (*fun) (int*)

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Par défaut
    Simple comme bonjour mais je n'y avais pas pensé (ou du moins si mais je m'étais trompé dans le cast donc ça ne marchait pas).

    Merci beaucoup

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/07/2009, 19h44
  2. Réponses: 15
    Dernier message: 30/08/2008, 11h34
  3. fonction replace et variable de type string
    Par aA189 dans le forum Access
    Réponses: 6
    Dernier message: 11/08/2006, 17h38
  4. Fonctions génériques et listes
    Par DevloNewb' dans le forum C++
    Réponses: 6
    Dernier message: 13/01/2006, 14h47
  5. Fonction LEFT sur champ de type "text" : méthodes
    Par MatthieuQ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 08/06/2004, 11h15

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