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 :

problème de transtypage


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut problème de transtypage
    Bonjour, dans mon programme, j'utilise un solveur pour résoudr mes équations différentielles. J'ai accès au code source de ce solveur.
    Il y a une structure qui est comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct CVodeMemRec {
     
    blabla
     
    int cv_qmax;
     
    } * CVodeMem;
    Pour utiliser le solveur, dans le main il faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void * cvode_mem = CVodeCreate(blabla);
    CVodeMalloc(cvode_mem,blabla);
    Je voudrais "tout simplement" afficher la valeur cv_qmax de la structure. J'ai donc fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int maxo=((struct CVodeMemRec) cvode_mem)->cv_qmax;
    printf("%d\n",maxo);
    mais j'ai une erreur :

    error: conversion to non-scalar type requested
    Savez-vous pourquoi ?
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int maxo=((struct CVodeMemRec) cvode_mem)->cv_qmax;
    printf("%d\n",maxo);
    mais j'ai une erreur :
    Tu as un pointeur, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int maxo=((struct CVodeMemRec *) cvode_mem)->cv_qmax;
    Mais pour moi, c'est crade et illisible (et je ne suis même pas sûr que ce soit correct).

    Je préfère écrire du code simple et clair qui fait une chose à la fois (le compilateur est assez grand pour optimiser, on est plus dans les années 70) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct CVodeMemRec *p =  cvode_mem;
    int maxo = p->cv_qmax;
    printf("%d\n",maxo);

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Citation Envoyé par salseropom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int maxo=((struct CVodeMemRec) cvode_mem)->cv_qmax;
    printf("%d\n",maxo);
    C'est le problème de cacher un pointeur par un typedef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int maxo=((struct CVodeMemRec *) cvode_mem)->cv_qmax;
    /* ou */
    int maxo=((CVodeMem) cvode_mem)->cv_qmax;
    Devrais régler le problème

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Re, merci pour vos réponse.
    Emmanuel, ta solution me donnait l'erreur suivante :

    dereferencing pointer to incomplete type
    En revanche, gege2061, ta seconde solution fonctionne. Mais, juste par curiosité, pourquoi est-ce que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int maxo=((struct CVodeMemRec) cvode_mem)->cv_qmax;
    renvoie un message d'erreur (cf ci-dessus) alors que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int maxo=((CVodeMem) cvode_mem)->cv_qmax;
    fonctionne ? On a bien, d'après le typedef

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct CVodeMemRec * CVodeMem
    Il y a qqch qui m'échappe...

    Merci

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    Emmanuel, ta solution me donnait l'erreur suivante :
    Laquelle ? J'en ai proposé 2.
    En revanche, gege2061, ta seconde solution fonctionne. Mais, juste par curiosité, pourquoi est-ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int maxo=((struct CVodeMemRec) cvode_mem)->cv_qmax;
    renvoie un message d'erreur (cf ci-dessus) alors que
    Déjà expliqué succintement. Je détaille.

    cvode_mem est un pointeur de type void*. Il n'est donc pas déréférencable.
    Tu as voulu utiliser un cast à-la-barbare. Je ne suis pas sûr de la syntaxe, mais ce qui est sûr c'est que le cast doit être de type pointeur, d'où le '*' que tu avais oublié.

    Mais ça ne suffit peut être pas (je n'utilise pas la programmation de chacal), et j'ai donné une alternative qui devrait fonctionner (bien que non vérifiée).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int maxo=((CVodeMem) cvode_mem)->cv_qmax;
    fonctionne ? On a bien, d'après le typedef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct CVodeMemRec * CVodeMem
    Ben oui, le typedef inclue l' '*', alors là, çà marche...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    oups, j'avais oublié de recopier l' "*" dans ton exemple, Emmanuel. Tout marche très bien.
    Merci des explications.

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

Discussions similaires

  1. encore un problème de transtypage
    Par Just-Soft dans le forum Langage
    Réponses: 11
    Dernier message: 19/11/2008, 10h59
  2. Problème de transtypage
    Par simoryl dans le forum C++
    Réponses: 6
    Dernier message: 05/06/2008, 01h33
  3. problème de transtypage (enfin je crois)
    Par troussepoil dans le forum C++
    Réponses: 5
    Dernier message: 02/03/2007, 17h32
  4. Problème de transtypage (ou de pointeur)
    Par seeme dans le forum C++
    Réponses: 3
    Dernier message: 20/12/2006, 09h36
  5. Problème de transtypage
    Par SunSyS dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 31/07/2006, 18h03

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