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 :

Caster de void * vers double[2][6]


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 23
    Points : 14
    Points
    14
    Par défaut Caster de void * vers double[2][6]
    Bonjour,

    Dans une fonction, je définis double mytab[2][6]. Comme je passe au travers d'une fonction générique qui prend un void *, je caste mytab a travers un void * (mycast = (void*)mytab)

    Comment puis-je récupérer mytab depuis mycast ?

    Merci

    Nicolas

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Le cast est inutile (mais pas nuisible) : le cast d'une adresse vers void* ou l'inverse est implicite.

    Comment puis-je récupérer mytab depuis mycast ?
    Ca peut dépendre de ce que tu veux faire ensuite. Si tu veux retrouver exactement le type d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double (*letab)[6] = mycast;
    (Les parenthèses et le 6 sont obligatoires)

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Tu devrais pouvoir caster le void* en double (*)[6] (c'est une syntaxe peu intuitive, mais le compilo n'accepte pas la notation double[6]*, plus parlante pour les humains).

    Généralement, pour tous les types un peu compliqués, j'utilise un typedef:
    Code C∩C++ : 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
    20
    21
    22
    23
    24
    25
    26
    /*C'est surtout celui-ci que je vais utiliser*/
    typedef double SixDoubles[6];
     
    /*Ce typedef-là, tu peux t'en passer.*/
    typedef double DeuxFoisSixDoubles[2][6];
     
    void uneFonction(void* param)
    {
    	/*Note: le cast explicite devrait être optionnel,
    	  si tu compiles en C.*/
    	SixDoubles *mytab = (SixDoubles*)param;
     
    	double toto = mytab[1][5];
    	return;
    }
     
    void uneAutreFonction(void)
    {
    	DeuxFoisSixDoubles mytab;
    	/*Juste pour vérifier que ça compile*/
    	SixDoubles* pPremiereLigne = mytab;
     
    	mytab[1][5] = 42.0;
     
    	uneFonction(mytab);
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    La première réponse ne fonctionne pas mais la deuxième (créer un type double[6]) fonctionne.

    Merci d'avoir réfléchi à mon pb

    Nicolas

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par doudounico Voir le message
    La première réponse ne fonctionne pas mais la deuxième (créer un type double[6]) fonctionne.
    Quelle réponse ne fonctionne pas ?
    Qu'avais-tu en fait tapé comme code, car les réponses données fonctionnent ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ça sent le compilateur C++, en effet...

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

Discussions similaires

  1. Copie de buffer void* vers un istream
    Par rikau2 dans le forum C++
    Réponses: 3
    Dernier message: 26/09/2007, 18h04
  2. Conversion hexa vers double
    Par EnigmuS dans le forum C
    Réponses: 13
    Dernier message: 16/05/2007, 15h06
  3. Conversion void* et double
    Par EnigmuS dans le forum C
    Réponses: 23
    Dernier message: 24/04/2007, 12h13
  4. Problème conversion float vers double
    Par jhenaff dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/01/2006, 11h39
  5. [XML\XQuery] Caster xs:duration vers xdt:dayTimeDuration
    Par Otarie dans le forum XQUERY/SGBD
    Réponses: 1
    Dernier message: 13/11/2005, 19h20

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