fortran和c++数据交换

第 11 章 C-Fortran 接口 (Sun Studio 12:Fortran 编程指南) (oracle.com)

此文详细介绍了不同数据类型的声明和调用方法。请注意不同编译器的实现不同。

通常,fortran例程按引用传递参数。而c通常按值传递参数。在fortran和c之间传递数据的标准方法是按引用传递。对于c,fortran的子程序或函数就像是一个所有参数都用指针表示的过程调用。例如:

int i=100;
float r;
extern void fsim_(int *i, float *r);
fsim_(&i, &r);
...

------------------------------

subroutine FSim(i,r)
  integer i
  real r
  r = i
  return
end 

fortran和c的数组索引和顺序不同。c数组总是从0开始,而fortran数组在缺省情况下是从1开始。因此,fortran数组元素B(2)等于c数组的b[1]。fortran数组按列主元存储,例如A(3,2)存储为:

A(1,1)  A(2,1)  A(3,1)  A(1,2)  A(2,2)  A(3,2)

而c数组为行主元,存储为:

A[0][0] A[0][1] A[1][0] A[1][1] A[2][0] A[2][1] 

 因此,对于多维数组,在数组操作时需要特别注意。例如,在c中进行部分矩阵操作,而后在fortran中完成剩余部分,这样做会产生混淆。最好是在一种语言中完成所有矩阵操作。

数组定义和访问的方法

extern void
     qref_( int[][10], int *);
...
 int m[20][10] = ... ;
 int sum;
...
 qref_( m, &sum );
...

------------------------------

SUBROUTINE QREF(A,TOTAL)
  INTEGER A(10,20), TOTAL
  DO I = 1,10
    DO J = 1,20
      TOTAL = TOTAL + A(I,J)
    END DO
  END DO
  ...

从c/c++访问fortran中定义的common块

How to access FORTRAN COMMON blocks from C/C++ - Advanced Features and User Routines - FLUKA User Forum (cern.ch)

例如,fortran中有如下定义的common块

real a1(100), b1(100)
integer i1,i2
common block / a1, b1, i1, i2 /

 在c中访问的方法为:

struct blocktype
{
    float a1[100];
    float b1[100];
    int i1;
    int i2;
}

extern "C" blocktype block;

注意不同的编译器实现不同。比如,vs2019和intel compiler 2021,用编译器的默认选项,上面的block和变量名都要大写,即使fortran中是小写。

而有的编译器要求c中的定义block要后面加下划线,block_。

另外,数据类型一定要对应,否则虽然能够运行,但结果明显不对。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值