Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

valeur d'un pointeur dans une fonction

11 réponses
Avatar
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\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?

--
Kevin

1 réponse

1 2
Avatar
Kevin Denis
Le 28-04-2011, Antoine Leca 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
1 2