Bonjour et bon debut de semaine.
j'ai un groupe de structure tres differentes les unes des autres que je veux parcourire. ex:donc la il y a 3 pointeurs vers des structures. par exemble myPeers est remplit comme suit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 fd=connection("127.0.0.1",9090); channel = action_getChannel(fd,my_id,"192.168.28.77"); mid_list= action_getMid(fd,my_id); myPeers = action_getPeers(fd,my_id,60,1); action_close(fd,my_id);maintenant ce que je veux faire c'est de parcourire avec un pointeur void et je suis un peu coincer. pour le moment ce que je fait c'est de creer une variable pour chaque type afin de sauvegarder l'adresse du pointeur comme ce si:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 action_getPeers() { int i; ALLOC(Peer *,p,(N+1)); //qui est une macro pour malloc + test //Peer **p = (Peer **) malloc(sizeof(Peer *) * (N+1)); if(p==NULL){fprintf(stderr,"alloc error : %s:%d\n",__FUNC__,__LINE__);exit(EXIT_FAILURE);} p[n]=NULL; for(i=n;i<N;++i) ALLOC(Peer,p[i],1); p->tuc=... p->machin=... .... return p; }
Mais je me dit que 5 structures ca me donnes 10 variables c'est trop; j'aimerai donc avec mes 5 pointeurs retourner et utiliser un seul pointeur void pour utiliser dans les different while,bien sur les structures sont tres differentes . prenons un cas concret avec mid_list qui n'est rien d'autre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Peer **myPeer,**pPeer; myPeers = action_getPeers(fd,my_id,60,1); pPeer=myPeers; while(*pPeer!=NULL) { //do something; ... ++pPeer; }
qu'un tableau de pointeurs sur des chaines de caracteres
quelque chose me dit qu' il doit y avoir une erreur et qu'un bug va me frapper tot ou tard?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 char **mid_list= action_getMid(fd,my_id); void *k; k=mid_list; while(*(char **)k != NULL) { fprintf(stdout,"\nMidserver : %s\n",*(char **)k); k+=sizeof(char **); } k=channel; while(*(ChannelA **)k != NULL) //... ...
En un mot j'ai pas trouver d'info sur le net et ceci est le fruit de ce que je crois avoir compris avec les pointeurs void * donc je doute.
il y a t-il une facon plus correct de faire la chose?Merci
Partager