首页 文章

如何将C_FLOAT数组传递给Fortran子例程

提问于
浏览
1

在Fortran中,我有一个 C_FLOAT 数组,它被声明为输入参数:

SUBROUTINE Main(n,myCArray)  BIND(C, NAME = 'Main')
INTEGER(C_INT),         INTENT(IN   ) :: n
REAL(C_FLOAT),          INTENT(INOUT), dimension(n) :: myCArray
    CALL PrintTheArray(n,myCArray)
END SUBROUTINE MAIN

正如 Main 子程序体中所写,我想将 myCArray 传递给另一个子程序,如下所示:

SUBROUTINE PrintTheArray(n,theCArray)
INTEGER(C_INT),         INTENT(IN   ) :: n
REAL(C_FLOAT),          INTENT(INOUT), dimension(n) :: theCArray
print *, theCArray(1), theCArray(2)
END SUBROUTINE PrintTheArray

通过这样做,我永远不会打印正确的数组值 . 但是,如果我在子例程 Main() 中打印值,则值是正确的 . 有什么问题,我该如何解决这个问题?


在Fortran中传递 C_FLOAT 数组确实没有问题 . 所以问题是错的 . 我在这里提供了一个Minimal,Complete和Verifiable示例(我使用的是Ubuntu,GNU Fortran(GCC)6.3.0,gcc(GCC)6.3.0):

文件名为 FORTRANFunc.f90 的Fortran代码

MODULE TEST
USE, INTRINSIC :: ISO_C_Binding
  IMPLICIT NONE
contains
subroutine CALLFORTRAN(n,myArray) BIND (C, NAME = 'CALLFORTRAN')
  INTEGER(C_INT),  INTENT(IN   )  :: n
  REAL(C_FLOAT),   INTENT(IN   )  :: myArray(n)
  CALL PRINTARRAY(n,myArray)
end subroutine CALLFORTRAN

subroutine PRINTARRAY(n, myArray)
  INTEGER(C_INT),  INTENT(IN   )  :: n
  REAL(C_FLOAT),   INTENT(IN   )  :: myArray(n)
  print *, myArray(1), myArray(2)
end subroutine PRINTARRAY
END MODULE TEST

文件名为 main.c 的C代码

#include <stdio.h>
#include <stdlib.h>
extern void CALLFORTRAN(int* n, float* myArray);

int main()
{
   int n=2;
   float*  myArray = (float*) malloc(2);
   myArray[0] = 0.5;
   myArray[1] = 1.5;
   CALLFORTRAN(&n,myArray);
   return 0;
}

你可以编译:

gfortran -c FORTRANFunc.f90
gfortran main.c FORTRANFunc.o -o test

然后你执行:

./test

结果应该是:

0.500000000       1.50000000

1 回答

  • 0

    我无法用gfortran 5.4.0(完整版: GNU Fortran (Ubuntu/IBM 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 )或IBM XL Fortran重现问题 . 对于新的gfortran,这可能是一个问题吗?

    $ gfortran -c FORTRANFunc.f90
    $ gcc -c main.c
    $ gfortran FORTRANFunc.o main.o -o test
    $ ./test
      0.500000000       1.50000000
    $
    

    此外,将 dimension(n) 更改为 dimension(*) 会有什么不同吗?

相关问题