Bonjour,

je cherche actuellement à utiliser une DLL Fortran dans un programme écrit en C.

Je parviens à charger ma DLL, à l'appeler et à récupérer une des deux variables qui m'intéressent. Cependant, dès que j'accède à ma 2eme variable (matrice 13 x 5), une erreur apparait (je pense qu'il s'agit d'un segmentation fault).

D'après ce que j'ai pu lire/entendre, le passage de tablueax multi-dimensionnels entre le fortran et le c peut poser problème.

Est-ce que quelqu'un sait si le problème vient effectivement de la, sinon d'où vient-il et comment le résoudre.

Ma routine Fortran est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
AMINEMeOH(TC, Namine, NumAmine, wAmine, wMeoH, k, alpha, PP, mat)
où TC est un double de taille 1 x 1
Namine un entier de taille 1 x 1
NumAmine un entier de taille 9 x 1 
wAmine un double de taille 9 x 1
wMeOH un double de taille 1 x 1 
k un entier de taille 2 x 1
alpha un double de taille 2 x 1
PP un double de taille 2 x 1 
mat un double de taille 13 x 5
Les valeurs de PP que je récupère sont bonnes.
Celles de mat des que j'essaie de les afficher ou de les utiliser, le problème intervient.

mon code 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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
 
#include <stdio.h> 
#include <windows.h> 
#include <stdlib.h>
 
typedef int (*MYPROC)(double* ,short int* , short int* , double* , double* , short int*, double*, double* , double**);
 
void call_dll(double* T_in, int* Namine_in ,  int* NumAmine_in, double* w_amine_in, double* wMeOH_in,  int* k_in, double* alpha_in, double* PP_in, double** Mat_in)
{
    short int* Namine = (short int*) malloc(1*sizeof(short int)) ;
    short int* NumAmine = (short int*) malloc(9*sizeof(short int)) ;
    short int* k = (short int*) malloc(2*sizeof(short int)) ;
    int i,j;
 
    *Namine = (short int) *Namine_in ;
    k[0] = (short int) k_in[0] ; 
    k[1] = (short int) k_in[1] ; 
 
    for(i=0;i<9;i++) {
        NumAmine[i] = (short int) NumAmine_in[i] ;
    }    
    HINSTANCE hinstLib; 
    MYPROC ProcAdd; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; 
    // Get a handle to the DLL module.
 
    hinstLib = LoadLibrary(TEXT("LibrairieAmineMeOH.dll")); 
 
    // If the handle is valid, try to get the function address.
    if (hinstLib != NULL) 
    { 
        ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("AMINEMeOH")); 
 
 
 
        // If the function address is valid, call the function.
        if (NULL != ProcAdd) 
        {
            fRunTimeLinkSuccess = TRUE;
          ProcAdd(T_in, Namine, NumAmine, w_amine_in, wMeOH_in, k, alpha_in, PP_in, Mat_in); 
        } 
        // Free the DLL module.
        fFreeResult = FreeLibrary(hinstLib); 
    } 
    // If unable to call the DLL function, use an alternative.
 
    if (! fRunTimeLinkSuccess) {
        printf("Message via alternative method\n"); 
    }    
}
 
 
 
int main() {
 
    int i, j;
    double* T = (double*) malloc(1*sizeof(double)) ;
    int* Namine = (int*) malloc(1*sizeof(int)) ;
    int* NumAmine = (int*) malloc(9*sizeof(int)) ;
    double* wAmine = (double*) malloc(9*sizeof(double)) ;
    double* wMeOH = (double*) malloc(1*sizeof(double)) ;
    int* k = (int*) malloc(2*sizeof(int)) ;
    double* alpha = (double*) malloc(2*sizeof(double)) ;
    double* PP = (double*) malloc(2*sizeof(double)) ;
    double** Mat = (double**) malloc(13*sizeof(double*)) ;
for(i=0;i<13;i++) {
    Mat[i] = (double*) malloc(5*sizeof(double)) ;
} 
 
for(i=0;i<9;i++) {
    NumAmine[i] = 0 ;
    wAmine[i] = 0 ;
}    
wAmine[0] = 30 ; 
NumAmine[0] = 1 ;
for(i=0;i<2;i++) {
    k[i] = 0 ;
    alpha[i] = 0 ;
    PP[i] = 0 ;
}
*Namine = 1 ;
 
 
for(i=0;i<13;i++) {
    for(j=0;j<5;j++) {
        Mat[i][j] = 0 ;
    }
}           
 
T[0] = 30 ;
 
 
wMeOH[0] = 0.000000001 ;
k[0] = 1 ;
k[1] = 1 ;
alpha[0] = 0.5 ;
alpha[1] = 0.5 ;
PP[0] = 0 ;
PP[1] = 0 ;
 
 
call_dll(T, Namine, NumAmine, wAmine, wMeOH, k, alpha, PP, Mat);
 
printf("T : %f\n\n",*T);
printf("Namine : %d\n\n",*Namine);
printf("wMeOH : %f\n\n",*wMeOH);
 
printf("k \t\t alpha \t\t PP \n");
for(i=0;i<2;i++) {
    printf("%d \t\t %0.4f \t\t %0.4f \n", k[i], alpha[i], PP[i]) ;
}    
 
printf("Num \t\t wAmine \n") ;
for(i=0;i<9;i++) {
    printf("%d \t\t %0.4f \n", NumAmine[i], wAmine[i]) ;
}    
/*
printf("Mat \n");
for(i=0;i<13;i++) {
    for(j=0;j<5;j++) {
        printf("%0.4f \t", Mat[i][j]) ;
    }
    printf("\n");
} 
*/
    return 0;
}
Ah oui aussi, je ne rencontre pas de problème sur d'autre routines où je n'ai que des scalaires et des tableaux uni-dimensionnel. Ce qui me conforte dans l'idée que le probème vient de la matrice.

Merci d'avance
Kokocha