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 :
pour sa j'utilise donc 2 type de variable :
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
le tout dans une class :
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
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 class BW_cmd_struc { public : void (*pt)(); char* cmd; };
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 struct dll { struct dll *prev; struct dll *next; void *data; };
-> commande_stok est la liste doublement chainée declarer dans la class principal
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; }
-> 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();
- les printf("ok\n"); me permet de voir ou est l'erreur
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 ; }
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 avecet donc je pense que ma maniere de recupere ma class depuis un void* et mauvaise
Code : Sélectionner tout - Visualiser dans une fenêtre à part Packcmd->cmd
j'ai essayer plusieur maniere de faire , mais rien n'a marcher alors je m'en remet a vous merci
Partager