GNT sans publicité, site mobile, fonctionnalitées exclusives...

valeur d'un pointeur dans une fonction

Le
Kevin Denis
Bonjour,

(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",v.value.i);
u_min(a,b,&valor);
printf("essai de u_min %d",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?

--
Kevin
Lire les 11 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #23316271
Bonjour,

Le 28/04/2011 11:38, Kevin Denis a écrit :

(système linux)
On m'a fourni un fichier .so a utiliser dans mon code.
[...]
int main(int argc, char*argv[]){
valeur v;
int a,b;
a=atoi(argv[1]); b=atoi(argv[2]);

printf("Valeur de value.i: %drn",v.value.i);
u_min(a,b,&valor);



Je suppose que c'est bien v ici et pas valor.

printf("essai de u_min %drn",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 tu rajoutes une initialisation, par exemple v.valeur.i = 7, avant
l'appel de la fonction, c'est bien cette valeur qui s'affiche après ?

Si je recompile
moi même la fonction (j'ai le .c après tout), alors le code ci-dessus
fonctionne. Pourquoi?



Peut-être le .so a-t-il été compilé avec une certaine option
d'alignement et ton programme avec une autre ?
Kevin Denis
Le #23316301
Le 28-04-2011, Olivier Miakinen
(système linux)
On m'a fourni un fichier .so a utiliser dans mon code.
[...]
int main(int argc, char*argv[]){
valeur v;
int a,b;
a=atoi(argv[1]); b=atoi(argv[2]);

printf("Valeur de value.i: %drn",v.value.i);
u_min(a,b,&valor);



Je suppose que c'est bien v ici et pas valor.



oui.

printf("essai de u_min %drn",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 tu rajoutes une initialisation, par exemple v.valeur.i = 7, avant
l'appel de la fonction, c'est bien cette valeur qui s'affiche après ?



Effectivement. i ne semble jamais mis à jour.
Si je lui donne une valeur, cette valeur est conservée malgré
l'appel à la fonction.

Le .so fonctionne puisque j'ai d'auitres programmes qui l'utilisent et
qui marchent bien, pour info.

Si je recompile
moi même la fonction (j'ai le .c après tout), alors le code ci-dessus
fonctionne. Pourquoi?



Peut-être le .so a-t-il été compilé avec une certaine option
d'alignement et ton programme avec une autre ?



Plus d'infos la dessus?

Je compile très basiquement:
gcc -Wall -I. -L. -o hello hello.c -lulib
--
Kevin
Pascal J. Bourguignon
Le #23316291
Kevin Denis
Bonjour,

(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 #include #include #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: %drn",v.value.i);
u_min(a,b,&valor);
printf("essai de u_min %drn",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?



Tu nous ment!
Le main présenté ci-dessus avec l'ulib.h donné, ne peut pas compiler.

S'il pouvait compiler:

1- le premier printf pourrait produire n'importe quoi. Par exemple,
faire sortir des dragons de ton nez, ou faire crasher le programme,
et pas seulement afficher une valeur quelconque.

2- même si ce premier printf continuait normalement, il n'y a absolument
aucune raison pour que u_min modifie v, tel que l'appel à u_min est
écrit.



--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Kevin Denis
Le #23316351
Le 28-04-2011, Pascal J. Bourguignon
Tu nous ment!
Le main présenté ci-dessus avec l'ulib.h donné, ne peut pas compiler.



"un extrait de l'ulib.h". Par contre mon code est complet.

S'il pouvait compiler:

1- le premier printf pourrait produire n'importe quoi. Par exemple,
faire sortir des dragons de ton nez, ou faire crasher le programme,
et pas seulement afficher une valeur quelconque.



ou poster sur les news?

2- même si ce premier printf continuait normalement, il n'y a absolument
aucune raison pour que u_min modifie v, tel que l'appel à u_min est
écrit.



une explication?
--
Kevin
Pascal J. Bourguignon
Le #23316401
Kevin Denis
Peut-être le .so a-t-il été compilé avec une certaine option
d'alignement et ton programme avec une autre ?



Plus d'infos la dessus?



Compile la bibliothèque toi-même!



En supposant qu'on enlève tout les mensonges, ça marche parfaitement:

[ :0 tmp]$ cat-sources Makefile ulib.[hc] ulibclient.c
---- Makefile ----------------------------------------------------------
all:test
ulib.so.1.0.0: ulib.c
gcc -g -Wall -fPIC -I. -c -o ulib.o ulib.c
gcc -g -Wall -shared -Wl,-soname,libulib.so.1 -o libulib.so.1.0.0 ulib.o
libulib.so:libulib.so.1.0.0
ln -sf libulib.so.1.0.0 libulib.so.1
ln -sf libulib.so.1 libulib.so
ulibclient:ulibclient.c libulib.so.1
gcc -g -Wall -I. -o ulibclient ulibclient.c -L. -lulib
test:ulibclient
LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH ./ulibclient

---- ulib.c ------------------------------------------------------------
#include void u_min(int a, int b, valeur *result) {
result->value.i = (a < b) ? a : b;
}
---- ulib.h ------------------------------------------------------------
#include
typedef struct valeur {
struct {
int i;
char *p;
} value;
size_t size;
int (*expand)(struct valeur *);
} valeur;

extern void u_min(int a, int b, valeur *result);
---- ulibclient.c ------------------------------------------------------
#include #include #include #include "ulib.h"
int main(int argc, char*argv[]){
valeur v;
int a,b;
a2; bU5;
v.value.iB;
printf("Valeur de value.i: %drn",v.value.i);
u_min(a,b,&v);
printf("essai de u_min %drn",v.value.i);
return 0;
}
------------------------------------------------------------------------
[ :0 tmp]$ make test
LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./ulibclient
Valeur de value.i: 42
essai de u_min 102
[ :0 tmp]$


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Publicité
Suivre les réponses
Poster une réponse
Anonyme