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

Langage C++ Discussion :

Void* et Static Cast


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Void* et Static Cast
    Bonjour, je débute en C+, et je réalise actuellement un programme C+ piloté depuis un programme en Fortran via une interface C. Le but :

    1) importer un fichier de géométrie STEP depuis une librairie C++ appelée OPENCascade
    2) Accéder séquentiellement via le fortran à la classe Open Cascade contenant cette géométrie. Pour cela j'ai besoin de garder un pointeur sur ma classe qui est en paramètre de mes fonction appelées depuis le Fortran.

    D'après la doc d'Intel, il existe une correspondance entre les pointeurs Fortran et le type void*. Je pense donc utiliser le type void* et StaticCast pour récupérer la classe pointée dans une nouvelle fonction C+. Ca compile mais mon nouveau pointeur ne pointe pas vers mon objet instancié précédemment (j'ai pour cela ajouté un attribut monEntier à la classe, initialisé à 0 dans le constructeur et modifié à 1247 dans la 1ère fonction. Dans la 2ème fonction, myImportBis->monEntier = 1 ...)

    Quelqu'un a t'il une idée sur la bonne manière de procéder pour récupérer la classe dans la 2ème fonction ? Merci d'avance


    Ma fonction C++
    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
     
    extern "C" void ReadSTEP(void* ptr, char* NomFichier)
    {
    	Import* myImport=new Import(); // Création de la classe contenant la géométrie
    	myImport->ReadSTEP(NomFichier); // Import des données géométriques
    	myImport->monEntier=1247;
    	ptr=&myImport; // Assignation du pointeur passé en référence.
    }
     
    extern "C" void GetNoeuds(void* ptr, char* NomFichier, float tablo[10])
    {
    	Import *myImportBis=static_cast<Import*>(ptr); 
    	myImportBis->GetNoeuds(NomFichier, tablo); // 1ère consultation de la classe,
    	delete myImportBis;
    }
    Mon Fortran qui appelle le C++ via une couche de C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          program fmain
          REAL TABLO(10)
          integer LNAME
          integer*4 PTR
          CHARACTER(LEN=256)::NAME
     
          CALL CREADSTEP(PTR, TRIM(NAME))
          CALL CGETNOE(PTR, TRIM(NAME),TABLO)
    end program

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    ptr est un pointeur, myImport est un pointeur, pourquoi stocker &myImport dans ptr ?
    En sortie de fonction, ptr pointe sur n'importe quoi, tu as de la chance de ne pas crasher. Tant quand tu l'utilises que quand tu essayes de le libérer.

    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Tu travailles avec une copie locale du pointeur dans ReadSTEP.
    Ton pointeur est passé par copie et non pas par référence comme tu sembles le croire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    extern "C" void ReadSTEP(void*& ptr, char* NomFichier)
     {     
    Import* myImport=new Import(); 
        myImport->ReadSTEP(NomFichier);
        myImport->monEntier=1247;     
    ptr=myImport; //myImport est déjà un pointeur !
    }
    PS / Je sais que tu manipules des interfaces entre des langages et tout, mais void* en C++ c'est quand même vachement moche !
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, effectivement j'ai un peu tendance à m'y perdre entre les étoiles et les esperluettes, ça fonctionne maintenant !
    @DavidBrcz : si tu as une manière plus propre de faire la chose, je suis preneur, ma question revient à
    "Comment faire pour garder une adresse mémoire d'un objet non détruit par Delete, une fois sorti d'une fonction C+ ?"

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/01/2008, 12h36
  2. cast sur un void*
    Par rikau2 dans le forum C++
    Réponses: 5
    Dernier message: 17/08/2007, 14h05
  3. cast conditionel d'un void *
    Par apesle dans le forum C
    Réponses: 4
    Dernier message: 09/02/2007, 08h41
  4. Surdéfinition de l'opérateur de cast (void *)
    Par Thierry Chappuis dans le forum C++
    Réponses: 4
    Dernier message: 07/12/2006, 11h21
  5. Static void? Informations sur le sujet.
    Par Remedy dans le forum C
    Réponses: 17
    Dernier message: 29/05/2006, 22h01

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