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 :
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;
}
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
#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;
                }
        }
}
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
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