在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
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
#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
答案 0 :(得分: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(*)
会有什么不同吗?