IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

void a tout faire.


Sujet :

C

  1. #1
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut void a tout faire.
    Bonjour et bon debut de semaine.

    j'ai un groupe de structure tres differentes les unes des autres que je veux parcourire. ex:
    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);
    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
    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;
    }
    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
    Peer **myPeer,**pPeer;
    myPeers = action_getPeers(fd,my_id,60,1);
    pPeer=myPeers;
    while(*pPeer!=NULL)
    {
        //do something;
        ...
        ++pPeer;
    }
    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
    qu'un tableau de pointeurs sur des chaines de caracteres

    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)
    //...
    ...
    quelque chose me dit qu' il doit y avoir une erreur et qu'un bug va me frapper tot ou tard?
    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
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  2. #2
    Membre régulier Avatar de Schaublore
    Homme Profil pro
    Manuel
    Inscrit en
    Octobre 2014
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Manuel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2014
    Messages : 61
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    Peut être qu'un union de channel; mid_list; et peer; fairait l'affaire. On incremente avec un membre. k+=sizeof(MyUnion.channel);
    f(x) = y

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lilington Voir le message
    quelque chose me dit qu' il doit y avoir une erreur et qu'un bug va me frapper tot ou tard?
    Salut

    Rare de te voir poser une question

    Il n'y a aucun soucis. T'as un pointeur void t'as tout à fait le droit de le caster dans le bon type avant de regarder le contenu de ce type. Si tu ne te trompes pas dans ton cast, alors ça roule.

    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char c='a';
    int i=123;
    double d=3.14159;
    void *pt;
     
    pt=&c;
    printf("Le caractère vaut %c\n", *(char*)pt);
     
    pt=&i;
    printf("L'entier vaut %d\n", *(int*)pt);
     
    pt=&d;
    printf("Le double vaut %f\n", *(double*)pt);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. 2008 & choix d'un langage à tout faire
    Par zulad dans le forum Langages de programmation
    Réponses: 126
    Dernier message: 04/03/2021, 00h13
  2. tout faire en une requete
    Par kaking dans le forum Langage SQL
    Réponses: 15
    Dernier message: 22/06/2009, 08h48
  3. Peut on tout faire avec JNLP ?
    Par Dave62 dans le forum JWS
    Réponses: 1
    Dernier message: 25/10/2008, 19h23
  4. Tout faire passer par http ?
    Par Michaël dans le forum Réseau
    Réponses: 14
    Dernier message: 26/10/2005, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo