|
[Fortran] 纯文本查看 复制代码 02 | subroutine gauss_jordan ( pa , pb , pc , n ) Bind ( C , Name = "gauss_jordan" ) |
03 | use , intrinsic :: ISO_C_Binding |
04 | type ( C_PTR ) , value :: pa , pb , pc |
06 | real , pointer :: a ( : , : ) , b ( : ) , c ( : ) |
07 | call c_f_pointer ( pa , a , [ n , n ] ) |
08 | call c_f_pointer ( pb , b , [ n ] ) |
09 | call c_f_pointer ( pc , c , [ n ] ) |
17 | forall ( i = 1 : n ) c ( i ) = b ( i ) / a ( i , i ) |
18 | end subroutine gauss_jordan |
25 | a ( j , i : n ) = a ( j , i : n ) - a ( i , i : n ) * p |
36 | a ( j , i : n ) = a ( j , i : n ) - a ( i , i : n ) * p |
C++调用fortran的DLL的例子
[C++] 纯文本查看 复制代码 01 | extern "C" void gauss_jordan( float *a , float *b , float *c , int n ); |
05 | int main( int argc, char *argv[]){ |
17 | gauss_jordan( a , b , c , N ); |
问题已解决!当C++中需要传递二维数组作为形参进入fortran算法时,并且大小不确定,可以先在C++中将它视为一维数组,保证该数组在内存地址中的连续性!不要用指针数组!那样会导致地址不连续,传入fortran算法时会出错!
总结起来,由于fortran中是按列存储数组,而C++中是按行存储,而在传递数组时,只是传递数组的首地址,所以当需要传入二维、三维、多维数组给fortran时,完全可以用C++中的一维数组代替,即只需要保证在C++中的那个数组是连续的内存区域,而不要用指针数组!!!(转换成二维、三维时需要注意两种语言的存储规则)
感谢2338021群里的群主大大,问题已解决!!!
再次感谢2338021群里的群主大大,Fortran Coder群里大佬云集,欢迎各位加入!! |
评分
-
查看全部评分
|