(système linux)
On m'a fourni un fichier .so a utiliser dans mon code.
J'ai le code C de cette librairie, dont voici un extrait:
void u_min(int a, int b, valeur *result) {
result->value.i = (a < b) ? a : b;
}
Et du ulib.h associé:
typedef struct valeur {
struct {
int i;
char *p;
} value;
size_t size;
int (*expand)(struct valeur *);
} valeur;
Une fonction très simple, et la structure valeur associée.
Je peux résumer le code qui ne fonctionne pas à un programme simple:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "ulib.h"
int main(int argc, char*argv[]){
valeur v;
int a,b;
a=atoi(argv[1]); b=atoi(argv[2]);
printf("Valeur de value.i: %d\r\n",v.value.i);
u_min(a,b,&valor);
printf("essai de u_min %d\r\n",v.value.i);
return 0;
}
Le résultat attendu est le suivant:
le premier printf doit m'afficher une valeur quelconque (uninitialized),
le second doit me donner le minimum des deux chiffres donnés en paramètre.
Si j'utilise la bibliothèque .so fournie, alors les deux valeurs
v.value.i sont identiques (à la valeur uninitialized). Si je recompile
moi même la fonction (j'ai le .c après tout), alors le code ci-dessus
fonctionne. Pourquoi?
Avec l'aide du code de Olivier Miakinen, j'en suis arrivé à cette conclusion. Le .h que j'utilise n'est pas le bon, car la structure de valeur a changé, il y a un int avant la seconde struct imbriquée (!) Ce qui explique que lorsque je recompile cette librairie partagée avec l'ancienne struct valeur, ça fonctionne, mais pas avec la nouvelle.
Avec le .h corrigé, le résultat est bien conforme à ce qui est attendu. $ ./new 4 6 Je force value.i à 9999 essai de u_min: 4 essai de u_max: 6 -- Kevin
Le 28-04-2011, Antoine Leca <root@localhost.invalid> a écrit :
avec une autre forme pour la structure valeur ?
Avec l'aide du code de Olivier Miakinen, j'en suis arrivé à cette
conclusion. Le .h que j'utilise n'est pas le bon, car la structure
de valeur a changé, il y a un int avant la seconde struct imbriquée (!)
Ce qui explique que lorsque je recompile cette librairie partagée avec
l'ancienne struct valeur, ça fonctionne, mais pas avec la nouvelle.
Avec le .h corrigé, le résultat est bien conforme à ce qui est attendu.
$ ./new 4 6
Je force value.i à 9999
essai de u_min: 4
essai de u_max: 6
--
Kevin
Avec l'aide du code de Olivier Miakinen, j'en suis arrivé à cette conclusion. Le .h que j'utilise n'est pas le bon, car la structure de valeur a changé, il y a un int avant la seconde struct imbriquée (!) Ce qui explique que lorsque je recompile cette librairie partagée avec l'ancienne struct valeur, ça fonctionne, mais pas avec la nouvelle.
Avec le .h corrigé, le résultat est bien conforme à ce qui est attendu. $ ./new 4 6 Je force value.i à 9999 essai de u_min: 4 essai de u_max: 6 -- Kevin