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 :

Allocation à l'exécution pour partage de variables avec Fortran?


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 5
    Par défaut Allocation à l'exécution pour partage de variables avec Fortran?
    Bonjour à tous,

    je développe actuellement un code de calcul scientifique en C++ (disons le code A) que j'aimerais pouvoir interfacer avec un code existant et codé en Fortran (code B). Pour cela j'ai rajouté aux sources du code B un fichier C qui fait l'interface en chargeant la librairie dynamique issue du code A (libA).

    Pour des raisons de communications entre les deux codes j'aimerais leur faire partager des espaces mémoires communs. Je suis arrivé à faire des choses très intéressantes à partir de tuto trouvés sur le net comme par exemple. J'arrive tout de même à une limitation sévère en ce qui concerne le partage de matrices.

    Si j'alloue les matrices à la compilation comme suit dans les fichiers Fortran et dans ma librairie:
    Code Module Fortran : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    REAL, DIMENSION(10,10) :: TESTMATRIX
    COMMON/FFCOUPLED/ TESTMATRIX
    ...
    Code Dans un fichier d'en-tête des mes sources donnant libA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    #ifdef __cplusplus
    extern "C" {
    #endif
    	struct{
    		double testmatrix[10][10];
    	} ffcoupled_;
    #ifdef __cplusplus
    }
    #endif
    ...

    j'obtiens un partage de la zone mémoire associée au common 'ffcoupled', càd que je peux modifier avec le code B ou avec libA la matrice 'testmatrix'. Il y a donc bien concordance des types et de la table d'allocation entre les deux codes.

    Maintenant ce qui me pose problème c'est que l'allocation de mémoire est 'compile-time' et non 'runtime'. J'aimerais donc modifier mes sources actuelles pour obtenir quelque chose proche des fichiers suivants:
    Code Module Fortran avec allocation à l'exécution : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    INTEGER :: NX, NY
    ... lecture des données fournies dans un fichier utilisateur ...
    REAL, DIMENSION(NX,NY) :: TESTMATRIX
    COMMON/FFCOUPLED/ TESTMATRIX
    ...

    Du coté du C++ cela devrait donc ressembler à quelque chose comme ça:
    Code Dans un fichier d'en-tête des mes sources donnant libA, disons foo.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    #ifdef __cplusplus
    extern "C" {
    #endif
    	struct{
    		double **testmatrix;
    	} ffcoupled_;
    #ifdef __cplusplus
    }
    #endif
    ...
    et l'allocation fonction de données disponibles uniquement à l'éxécution:
    Code dans le fichier foo.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ...
    #ifdef __cplusplus
    extern "C" {
    #endif
    void AllocateMatrix(const int nx, const int ny){
    	ffcoupled_.testmatrix = new double*[nx];
    	int i;
    	for( i=0 ; i<nx ; i++ ) {
    		ffcoupled_.testmatrix[i] = new double[ny];
    	}
    }
    #ifdef __cplusplus
    }
    #endif
    ...

    mais je perds alors le partage d'espace mémoire entre les codes A et B. Je viens donc vers vous pour savoir si il existe une raison fondamentale à ce que l'allocation dynamique ne permette pas le partage que j'obtiens avec des allocations 'compile-time' ou si ce partage est possible (et donc que mon implantation est simplement mauvaise...).

    Merci d'avance pour vos réponses,
    Xavier

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Tu dois allouer un seul tableau de taille nx*ny, et non nx tableaux de taille ny.
    Ensuite, tu devras faire systématiquement la multiplication lors de tes accès côté C++ (ou passer par un truc de ce genre, mais faire attention à quelle adresse tu passes à Fortran).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/05/2015, 18h55
  2. objMessage.AddAttachment avec pour chemin, une variable
    Par jipechibi dans le forum VBScript
    Réponses: 3
    Dernier message: 07/10/2008, 10h24
  3. [Smarty] Un probleme pour passer des variables avec Smarty
    Par aztec dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 31/03/2008, 15h01
  4. Réponses: 5
    Dernier message: 03/12/2007, 23h45
  5. Count de variable avec separateur pour une meme ligne
    Par snanot dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/02/2007, 17h11

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