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