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



在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数组确实没有问题。所以这个问题是错误的。我在这里提供了一个最小,完整和可验证的示例(我使用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

我无法重现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(*)有什么不同吗?

最新更新