Int et void*

Résolu
mél -  
 loupius -
Bonjour,
j'ai un petit soucis . En fait j'ai une fonction generique de type :
void inserer(struct A,void * elem){}

et j'ai une fonction qui fait appel a celle la:

void inserer_entier(struct B, int elem){
void *tmp=(void *)elem;
inserer( B->deleg, elem);
}

mais ca ne marche pas.
erreur: transtypage vers un pointeur depuis un entier de taille différente


ma structure B est la suivante
struct B{
struct A->deleg
}

quelqun aurait il une solution svp
merci.(je travaille en c).

4 réponses

mél
 
j'ai oublié de préciser que j'ai essayé pas mal de combinaisons mais ca ne marche toujours pas!!!
0
loupius
 
void inserer_entier (struct B, int elem)
{
  void *tmp=(void *)elem;
  inserer( B->deleg, elem);
}
Evidemment 'elem' est un 'integer', tu ne peux le transformer en 'void*'; le propose:
void inserer_entier (struct B, int* elem)
{
  inserer (B->deleg, (void*)elem);
}
0
mél
 
je vais essyer celà de ce pas. merci pour l'interet que tu as porté sur ma question.
0
mél
 
merci j'ai finalement essayé ce que tu m'a dis je n'ai finalement plus cette erreur.
Par contre lorsque je test :

int main(void){

struct s=creer_struct_A();
int a;
*a=5;
int b;
*b=18;
inserer(s,a);
printf(){};//affiche le champs de la structure ou a a été affecté

inserer(s,b);
printf(){};

la première insertion se passe bien cependant la ligne (*a=18) génère une erreur de segmentation et je n'arrive pas comprendre pourquoi;
0
loupius > mél
 
Le code suivant:
int a;
*a = 5;
n'a aucun sens et ça ne doit pas passer à la compilation (pour moi c'est un mystère).
Il faut déclarer:
int* a;
*a = 5;
0
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570 > loupius
 
Salut,

(pour moi c'est un mystère).

L'opérateur unaire de déréférence * s'applique à un pointeur et il donne l'accès à l'objet pointé par le pointeur.

Dans ce cas int a, a n'est pas une pointeur mais une variable normale. Comme * ne peut être appliqué qu'à un pointeur, tu te rends compte que tu le savais déjà, donc il n'y a plus de mystère ;-))

Il suffit de l'appliquer au pointeur &a et ça marche
lami20j@debian:~/trash$ cat int.c
#include<stdio.h>

int main()
{
        int a;
         *&a = 5;
        printf("%d\n",a);
        return 0;
}
lami20j@debian:~/trash$ gcc int.c
lami20j@debian:~/trash$ ./a.out
5

Mais bon, autant faire a=5

0
loupius > lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité
 
Ce qui pour moi était un mystère, c'était que ça puisse passer à la compilation.
Je vais en profiter pour corriger le code; en effet j'aurais dû écrire:
int* a;
a = (int*)malloc(sizeof(int));
*a = 5;
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Salut,
Ce code :

int a;
*a=5;

ne doit pas passer à la compilation (à moins que le compilateur ne respecte pas la norme). Si tu veux que cela passe à la compilation, il faudra réaliser des casts. Attention tout de même à initialiser la variable "a" qui devra contenir une adresse.
Par exemple :

int a; //il manque toujours l'adresse stockée dans a.
*(int *)a=5;


Plus simple serait le code proposé par loupius

int *a;
*a=5;

qui passera la compilation. Mais cela provoquera une erreur de segmentation à l'exécution puisque la variable "a" ne contient toujours pas d'adresse.
0
Charles
 
void inserer_entier(struct B, int elem){
void* stack_elem = malloc(sizeof(int));
*(int*)stack_elem = elem;
inserer( B->deleg, stack_elem);
}
0