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 :

Erreur pointeur sur fonction en parametre, le tout de type générique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Par défaut Erreur pointeur sur fonction en parametre, le tout de type générique
    Salut à tous, j'essaye de développer une matrice de type générique, mais je me heurte à un probleme lors de la compilation. Voici mon code :
    main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     #include <stdio.h>
     #include <stdlib.h>
     #include "grid.h"
     #include "boat.h"
     
     int main (int argc, char * argv[]){
        TGrid grid;
     
        grid = cGrid (10,10);
     
        dGrid (grid,dBoat);
     
    	return 0;
     }
    boat.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "boat.h"
     
     
     void dBoat (TBoat * pB)
     {
         pB->bDamage = 0;
         pB->bLength = 0;
         pB->bID = -1;
     }
    boat.h :
    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
    #ifndef BOAT_H
    #define BOAT_H
     
    typedef
    struct {
        int bID;// -1 pour un bateau non initialise
        unsigned int bLength;
        unsigned int bDamage;
    }TBoat;
     
    /*
     * N : dBoat
     * D : fonction de destruction d'un bateau
     * E : pB
     * S : /
     * R : /
     * P : /
     */
     void dBoat (TBoat * pB);
     
     
     
    #endif
    grid.h :
    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
    31
    32
    33
    34
    35
    #ifndef GRID_H
    #define GRID_H
     
     
    struct TCell {
            void * element;
    };
     
    typedef struct {
            struct TCell ** matrix;
            unsigned int nbColumns;
            unsigned int nbLines;
    } TGrid;
     
    //En-Têtes des fonctions////////////////////////////////
    /*
     * N : cGrid
     * D : Createur - Initialise une grille
     * E : pNbColumn (Le nombre de colonne), pnbLine (Le nombre de ligne)
     * S : /
     * R : TGrid
     * P : Les 2 entiers doivent être strictement positifs
     */
    TGrid cGrid (unsigned int pNbColumn,unsigned int pnbLine);
     
    /*
     * N : dGrid
     * D : Destructeur - Supprime une grille
     * E : pGrid (la grille), dElement (Un pointeur de fonction sur la fonction permettant de detruire l'element, cette fonction doit prendre en parametre un pointeur)
     * S : pGrid
     * R : /
     * P : /
     */
    void dGrid (TGrid & pGrid,void (*dElement)(void *));
    #endif
    grid.c :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <stdlib.h>
    #include <stdio.h>
    #include "grid.h"
     
     
     
    TGrid cGrid (unsigned int pNbColumn,unsigned int pnbLine)
    {
        unsigned int i,j;
        TGrid grid;
        grid.matrix = NULL;
     
        //Allocation des espaces memoire correspondant aux lignes
        grid.matrix = (TCell **)malloc(pnbLine * sizeof(TCell *));
        if(grid.matrix == NULL){
            perror("cGrid : allocation error ");
            exit (1);
        }
     
        //Allocation des colonnes
        for (i=0;i<pnbLine;i++){
            grid.matrix[i] = NULL;
            grid.matrix[i] = (TCell *)malloc(pNbColumn * sizeof(TCell));
            if(grid.matrix[i] == NULL){
                perror("cGrid : allocation error ");
                exit (1);
            }
        }
     
        //Initialisation des cases à NULL
        for (i=0;i<pnbLine;i++)
            for (j=0;j<pNbColumn;j++)
                grid.matrix[i][j].element = NULL;
     
        //Initialisation des valeurs de la structure
        grid.nbColumns = pNbColumn;
        grid.nbLines = pnbLine;
     
        return grid;
    }
     
     
    void dGrid (TGrid & pGrid,void (*dElement)(void *)){
        unsigned int i,j;
     
        for (i=0;i<pGrid.nbLines;i++){
            for(j=0;j<pGrid.nbColumns;j++){
                //Suppression de l'element
                dElement(&(pGrid.matrix[i][j].element));
            }
            //Supression de la colonne
            free(pGrid.matrix[i]);
        }
        //Suppression des lignes
        free(pGrid.matrix);
     
        //Mise à jour de la structure
        pGrid.nbColumns = 0;
        pGrid.nbLines = 0;
    }

    Et enfin l'erreur de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    main.cpp||In function 'int main(int, char**)':|
    main.c|17|error: invalid conversion from 'void (*)(TBoat*)' to 'void (*)(void*)'|
    main.c|17|error:   initializing argument 2 of 'void dGrid(TGrid&, void (*)(void*))'|
    ||=== Build finished: 2 errors, 0 warnings ===|

    Il doit y avoir un problème lors de l'appel de dGrid, et surtout avec le pointeur de fonction, mais je ne vois pas vraiment d'où çà vient. Pouvez-vous m'aider, ou me rediriger vers une aide car j'ai pas mal cherché sans trouver la solution.

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 22
    Par défaut
    Bonjour,

    l'erreur viens du fait que le pointeur sur fonction passe en paramètre est de type void (*ptr)(TBoat *);
    Mais la fonction attend un pointeur du type void (*ptr)(void *);
    Il faudrait donc soit changer le parametre de la fonction en void* et ensuite caster le void * en TBoat * ou alors faire prendre un TBoat * en paramètre au pointeur sur fonction dans la fonction dGrid.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void dGrid (TGrid & pGrid,void (*dElement)(void *)){
    Le passage par référence n'existe pas en C ! Ton code est donc incompilable.

    Le C et le C++ sont deux langages à part entière.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Par défaut
    En realité je compile en c++, mais sans utiliser le coté orienté objet, de façon à avoir les passages par reference et les booleens ^^

    Merci pour votre aide, tout compile bien avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     void dBoat (void * pB)
     {
         TBoat *boat;
     
         boat = (TBoat *) pB;
         boat->bDamage = 0;
         boat->bLength = 0;
         boat->bID = -1;
     }

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    En realité je compile en c++, mais sans utiliser le coté orienté objet, de façon à avoir les passages par reference et les booleens ^^
    Cela ne change rien à l'affaire : les références en C n'existent pas et tes codes sont donc incompilables avec un compilateur C.
    Il aurait fallu poster sur le forum C++.

    Tu peux te passer des références en faisant passer l'adresse de l'objet dont tu veux modifier la valeur. Et là, ça compilera.

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

Discussions similaires

  1. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  2. erreur C2664 : pointeur sur fonction
    Par hiko-seijuro dans le forum C++
    Réponses: 2
    Dernier message: 26/07/2005, 14h50
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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