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 :

Recuperation d'une adresse dans un tableau de *void


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 015
    Billets dans le blog
    1
    Par défaut Recuperation d'une adresse dans un tableau de *void
    Je cherche par tous les moyens mais je n'y arrive pas alors je post.
    j'ai un tableau de void*
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int stars1[NB_STARS][2]={0}, stars2[NB_STARS][2]={0}, stars3[NB_STARS][2]={0};
    SDL_Surface *ecran=NULL;
     
    void *adresses[4]={&stars1, &stars2, &stars3, &ecran};
    *adresse est utilisé pour une fonction de callback(timer) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    timer=SDL_AddTimer(17, anim, adresses);
    et voici le debut d'"anim" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Uint32 anim(Uint32 intervalle, void *pointeur) {
        SDL_Surface *screen=(SDL_Surface*)(pointeur+3);
    [...]
    }
    Seulement en vérifiant les adresses de screen et ecran sont différentes j'ai l'impression qu'il me prend l'adresse pointée par pointeur et qu'il y ajoute 3. mais je vois pas comment faire autrement(j'ai essayé pas mal de truc avec a chaque coup une erreur de compilation).
    Merci de votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    &écran correspond au 4 ème élément de ton tableau de pointeur void.

    La position de (void *)&écran est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (pointeur + 3) ou &pointeur[3]
    Le contenu de cette zone est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    &ecran = *(pointeur + 3) ou pointeur[3]
    C'est donc un SDL_Surface **

    Pour avoir la valeur de ton SDL_Surface * ecran, il faut mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    *(SDL_Surface **)pointeur[3];
    (je ne suis pas sûr qu'on ai le droit de mettre directement un * avec un pointeur void)

  3. #3
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Citation Envoyé par stc074 Voir le message
    [CODE]Uint32 anim(Uint32 intervalle, void *pointeur) {
    SDL_Surface *screen=(SDL_Surface*)(pointeur+3);
    [...]
    J'ai un gros doute là.

    Il me semble que par défaut l'arithmétique sur un pointeur void fera que tu avance de 1 en 1.

    Donc pour moi, (pointeur + 3), sera une adresse 3 octets plus loin que 'adresses'.

    Ce serait moins tordu (prise de tête ?) si tu utilisais une structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    struct timer_data_s
    {
     int * stars1;
     int * stars2;
     int * stars3;
     SDL_Surface * ecran; 
    };
    /* ... */
    struct timer_data_s timer_data = {&stars1, &stars2, &stars3, ecran};
    /* ... */
    SDL_AddTimer(17, anim, &timer_data);
    /* ... */
    Uint32 anim(Uint32 intervalle, void *pointeur) 
    {
      struct timer_data_s *timer_data = (struct timer_data_s *)pointeur;
      SDL_Surface *screen = timer_data->ecran;
      /* ... */
    }

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Donc pour moi, (pointeur + 3), sera une adresse 3 octets plus loin que 'adresses'.
    Je crois plutôt que l'arithmétique des pointeurs sur void est à proscrire et provoquent un comportement indéfini.

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 532
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 532
    Par défaut
    salut je ne comprends pas trop l'intérêt d'utiliser un tableau de void*...
    void * c'est pour utiliser principalement des pointeurs de fonctions ou alors pour passer un type générique à une fonction quitte à réarranger l'alignement en mémoire avec un cast ( transtypage)

    Comme l'écrit Diogene c'est pas coneillé à utiliser
    A quoi sert la structure stars ?
    Tu devrais mieux gérer des listes chainées pour ça

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Il ne fait pas d'arithmétique sur des pointeurs void mais sur des pointeurs de pointeurs void.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void *tab; //pointeur void
    void *tab[5]; //pointeur de pointeur void pointant sur tab[0]

  7. #7
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Non Neckara. Quand il fait ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Uint32 anim(Uint32 intervalle, void *pointeur) {
        SDL_Surface *screen=(SDL_Surface*)(pointeur+3);
    [...]
    }
    'pointeur' est bien un pointeur "tout court"...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recuperer la valeur d'une dimension dans un tableau
    Par bmad1 dans le forum QlikView
    Réponses: 0
    Dernier message: 28/09/2009, 14h37
  2. Réponses: 1
    Dernier message: 31/07/2009, 13h33
  3. recuperer une ligne dans un tableau
    Par jakcam dans le forum SQL
    Réponses: 1
    Dernier message: 04/03/2008, 11h35
  4. Comment récupérer le résultat d'une requête dans un tableau ?
    Par Kylen dans le forum Accès aux données
    Réponses: 1
    Dernier message: 14/06/2006, 19h32

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