Fortran Coder

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

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

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
14 元
贡献
11 点
跳转到指定楼层
楼主
发表于 2017-10-18 19:46:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
!Fortran的算法,Guass_Jordan法解线性方程
subroutine gauss_jordan(pa,pb,pc,n) Bind(C,Name="gauss_jordan")
  use , intrinsic :: ISO_C_Binding
  type(C_PTR) , value :: pa , pb , pc
  integer , value :: n
  real , pointer  :: a(:,:),b(:),c(:)
  call c_f_pointer( pa , a , [n,n])
  call c_f_pointer( pb , b , [n])
  call c_f_pointer( pc , c , [n])
    print *,"a=",a
    print *,"b=",b
    print *,"c=",c

    call up(a,b,n)
    call up(a,b,n)
    call low(a,b,n)
    forall(i=1:n)c(i)=b(i)/a(i,i)
end subroutine gauss_jordan

subroutine up(a,b,n)
    real a(n,n),b(n)
    do i=1,n-1
        do j=i+1,n
            p=a(j,i)/a(i,i)
            a(j,i:n)=a(j,i:n)-a(i,i:n)*p
            b(j)=b(j)-b(i)*p
        end do
    end do
end subroutine up

subroutine low(a,b,n)
    real a(n,n),b(n)
    do i=n,2,-1
        do j=i-1,1,-1
            p=a(j,i)/a(i,i)
            a(j,i:n)=a(j,i:n)-a(i,i:n)*p
            b(j)=b(j)-b(i)*p
        end do
    end do
end subroutine low

C++调用fortran的DLL的例子
[C++] 纯文本查看 复制代码
extern "C" void gauss_jordan( float *a , float *b , float *c , int n );

const int N = 5;

int main(int argc, char *argv[]){
  float *a , *b , *c;
  a = new float[N*N];
  b = new float[N];
  c = new float[N];
  for(int i=0;i<N;i++){
    for(int j=0;j<N;j++){
      a[i*N+j] = (i+1)*j;
    }
    b[i] = i*10-3;
    c[i] = i*-30+23;
  }  
  gauss_jordan( a , b , c , N );
  delete[] a;
  delete[] b;
  delete[] c;
  return 0;
}

问题已解决!当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, 2024-11-23 22:23

Powered by Tencent X3.4

© 2013-2024 Tencent

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