bonjour a tous !

je suis actuellement en train de programmer un petit system qui me permet d'appeller une fonction grace a une chaine ...

petit exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
add_cmd("print",&print); // ajout la commande et de sa fonction
cmd("print"); // vas cherche si une commande s'appele printf puis appele sa fonction
pour sa j'utilise donc 2 type de variable :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
void (*pt)(); // pour stoker le pointeur de la fonction
char* cmd; // pour stoker la chaine
le tout dans une class :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
class BW_cmd_struc
{
    public :
        void (*pt)();
        char* cmd;
};
afin de simplifier la gestion j'utilise une liste doublement chainée de structure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
struct dll
{
   struct dll *prev;
   struct dll *next;
   void *data;
};
jusque ici pas de probleme , je tape ma fonction add_cmd(); (elle est pas encore finaliser)
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
bool BWconsol::add_cmd(char* commande,void (*pFunction) ())
{
    if(commande == NULL)
    return false;
 
    //if(pFunction > 0)
    //return false;
 
 
    BW_cmd_struc *Packcmd = NULL;
    Packcmd = new BW_cmd_struc;
 
    if(Packcmd == NULL)
        printf("pas ok\n");
 
    Packcmd->cmd= commande;
    Packcmd->pt = pFunction;
 
    dll_insert(&commande_stok, &Packcmd);
 
    return true;
}
-> commande_stok est la liste doublement chainée declarer dans la class principal
-> dll_insert(); me permet d'inserer une nouveaux noeud dans ma chaine et donc ici ma classe Packcmd

et quand je l'appelle tout marche bien (aucun plantage)

alors je passe a ma fonction cmd();
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
void BWconsol::cmd(char* commande)
{
    if(commande==NULL)
        return ;

    BW_cmd_struc *Packcmd = NULL;
    Packcmd = new BW_cmd_struc;
    
    int size = dll_sizeof(commande_stok); // permet de conaitre la taille de la chaine

    dll_first (&commande_stok); // me pemet de me placer au debut de la chaine
    while (size > 0)
    {
        printf("ok\n");
        Packcmd = (BW_cmd_struc*) dll_data(commande_stok); // je recupere la classe dans le void
        
        if(Packcmd == NULL)
            printf("pas ok\n");
        
        char *temp1 = Packcmd->cmd; // bug ici
        

        printf("ok\n");
        if(strcmp(temp1,commande)==0)
        {
            //(*Packcmd.pt) (); // enlever pour les tests
            return ;
        }
        
        dll_next (&commande_stok); // passe a l'element suivant
    }
    return ;
}
- les printf("ok\n"); me permet de voir ou est l'erreur

je lance donc mon programme (en mode console et mode debug sur dev-c++) :
- je voie le 1er "ok" dans la fonction cmd
- puis "pas ok" (normal ?)
- puis la dev-c++ me renvoie une erreur de segmentation fault pour la ligne marque "bug ici"

j'ai donc un probleme avec et donc je pense que ma maniere de recupere ma class depuis un void* et mauvaise

j'ai essayer plusieur maniere de faire , mais rien n'a marcher alors je m'en remet a vous merci