Bonjour,
Je me trouve confronté à un problème et je ne comprends vraiment pas d'où peut venir cette erreur.
Je travaille sur HP-UX avec le compilateur aCC.
J'ai simplifié mon programme pour l'exemple. Il est composé d'un main et d'un plugin.
J'ai une librairie dynamique qui contient une fonction inversion. Cette fonction prend une map en paramètre.
J'ai une map qui contient 2 éléments.
Je parcours la map dans mon main avant l'appel à cette fonction en affichant les éléments --> OK.
J'appelle la fonction inversion de mon plugin en lui passant la map en paramètre, et dans cette fonction inversion, je parcours la map en affichant les éléments.
Erreur : Seul le premier élément est affiché, le parcours de la map continue comme si ma map contenait une infinité d'éléments vides
Je parcours la map dans mon main après l'appel à cette fonction en affichant les éléments --> OK.
Voilà, j'espère sincèrement que ça inspirera quelqu'un, car je deviens fou à chercher ce qui ne va pas :'(
Voilà mon code :
Main.cpp :
Plugin.cpp :
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 #include <dlfcn.h> #include <iostream.h> #include <string> #include <map> int main() { void* handle; map<const string,string> contexte; typedef void (*fonction_t)(map<const string,string> &); //Ouverture de la librairie handle = dlopen("plugin.sl", RTLD_LAZY); if (!handle) return -1; //Recuperation de la fonction fonction_t fonction = (fonction_t) dlsym(handle, "inversion"); const char *dlsym_error = dlerror(); if (dlsym_error) return -1; contexte["date"] = "toto"; contexte["message"] = "pouet"; map<const string,string>::iterator it; //Affichage avant appel fonction plugin for(it=contexte.begin();it!=contexte.end();it++) cout << it->first << " : " << it->second << endl; cout << "//////////////////////" << endl; //Appel fonction plugin fonction(contexte); cout << "//////////////////////" << endl; //Affichage apres fonction plugin for(it=contexte.begin();it!=contexte.end();it++) cout << it->first << " : " << it->second << endl; dlclose(handle); return 0; }
Mon makefile (les options pour la compilation diffèrent de gcc pour les librairies dynamiques )
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 #include <iostream.h> #include <string> #include <map> extern "C" void inversion(map<const string,string> & contexte) { map<const string,string>::iterator it; int i=0; for(it=contexte.begin();it!=contexte.end();it++,i++) { cout << it->first << " : " << it->second << endl; if (i==5) { cout << "Break car boucle infinie..." << endl; break; } } }
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 CC = aCC CFLAGS = -I. -I/opt/aCC/include -g +W 829 mytest: main.o $(CC) -o mytest main.o main.o: main.cpp plugin.sl $(CC) -c main.cpp $(CFLAGS) -ldl plugin.sl: plugin.o $(CC) -b -o plugin.sl plugin.o $(CFLAGS) plugin.o: plugin.cpp $(CC) +z -c plugin.cpp $(CFLAGS)
Et pour finir voici le résultat de l'éxécution de mon programme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 ./mytest date : toto message : pouet ////////////////////// date : toto : : : : : Break car boucle infinie... ////////////////////// date : toto message : pouet
Partager