Fortran Coder

查看: 6946|回复: 0
打印 上一主题 下一主题

[混编] C++fortran混编时,传递大小不定的二维数组的解决办法!

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
14 元
贡献
11 点
跳转到指定楼层
楼主
发表于 2017-10-18 19:46:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
01!Fortran的算法,Guass_Jordan法解线性方程
02subroutine 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
05  integer , value :: n
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])
10    print *,"a=",a
11    print *,"b=",b
12    print *,"c=",c
13 
14    call up(a,b,n)
15    call up(a,b,n)
16    call low(a,b,n)
17    forall(i=1:n)c(i)=b(i)/a(i,i)
18end subroutine gauss_jordan
19 
20subroutine up(a,b,n)
21    real a(n,n),b(n)
22    do i=1,n-1
23        do j=i+1,n
24            p=a(j,i)/a(i,i)
25            a(j,i:n)=a(j,i:n)-a(i,i:n)*p
26            b(j)=b(j)-b(i)*p
27        end do
28    end do
29end subroutine up
30 
31subroutine low(a,b,n)
32    real a(n,n),b(n)
33    do i=n,2,-1
34        do j=i-1,1,-1
35            p=a(j,i)/a(i,i)
36            a(j,i:n)=a(j,i:n)-a(i,i:n)*p
37            b(j)=b(j)-b(i)*p
38        end do
39    end do
40end subroutine low

C++调用fortran的DLL的例子
[C++] 纯文本查看 复制代码
01extern "C" void gauss_jordan( float *a , float *b , float *c , int n );
02 
03const int N = 5;
04 
05int main(int argc, char *argv[]){
06  float *a , *b , *c;
07  a = new float[N*N];
08  b = new float[N];
09  c = new float[N];
10  for(int i=0;i<N;i++){
11    for(int j=0;j<N;j++){
12      a[i*N+j] = (i+1)*j;
13    }
14    b[i] = i*10-3;
15    c[i] = i*-30+23;
16  
17  gauss_jordan( a , b , c , N );
18  delete[] a;
19  delete[] b;
20  delete[] c;
21  return 0;
22}

问题已解决!当C++中需要传递二维数组作为形参进入fortran算法时,并且大小不确定,可以先在C++中将它视为一维数组,保证该数组在内存地址中的连续性!不要用指针数组!那样会导致地址不连续,传入fortran算法时会出错!
总结起来,由于fortran中是按列存储数组,而C++中是按行存储,而在传递数组时,只是传递数组的首地址,所以当需要传入二维、三维、多维数组给fortran时,完全可以用C++中的一维数组代替,即只需要保证在C++中的那个数组是连续的内存区域,而不要用指针数组!!!(转换成二维、三维时需要注意两种语言的存储规则)
感谢2338021群里的群主大大,问题已解决!!!
再次感谢2338021群里的群主大大,Fortran Coder群里大佬云集,欢迎各位加入!!

评分

参与人数 1贡献 +6 收起 理由
fcode + 6 赞一个!

查看全部评分

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-5-4 00:26

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表