我对整个混合fortran C编程都很陌生。试图编译this page中提到的例子,但我得到一些我不明白的错误。 C部分正确编译,所以我把fortran代码放在这里:
MODULE type_mod
USE iso_c_binding
TYPE, bind(c) :: type2_t
INTEGER(c_int) :: idx, size
END TYPE type2_t
TYPE, bind(c) :: type3_t
INTEGER(c_int) :: idx, size
END TYPE type3_t
TYPE, bind(c) :: type1_t
TYPE(type2_t) :: params
TYPE(c_ptr) :: status
INTEGER(c_int) :: idx
END TYPE type1_t
END MODULE type_mod
PROGRAM test_f_to_c
USE iso_c_binding
USE type_mod
INTERFACE
SUBROUTINE init_data(A,N) bind(c)
USE iso_c_binding
USE type_mod
TYPE(type1_t) :: A
INTEGER(c_int), value :: N
END SUBROUTINE init_data
END INTERFACE
INTEGER, value :: N
PARAMETER(N=10)
TYPE(type1_t) :: A
INTEGER :: i
TYPE(type3_t), DIMENSION(:), POINTER :: status
CALL init_data(A,N)
PRINT *, A%idx, A%params%idx, A%params%size
CALL c_f_pointer(A%status,status,[N])
DO i=1,N
PRINT *, i, status(i)%idx, status(i)%size
ENDDO
END PROGRAM test_f_to_c
我用
编译它gfortran -c foo.f90
我得到的错误:
test13F.f90:35:33:
CALL c_f_pointer(A%status,status,N)
1
Error: 'shape' argument of 'c_f_pointer' intrinsic at (1) must be of rank 1
如果您能帮助我理解为什么我会收到此错误,我将如何解决,如果有其他示例请提供链接,我将不胜感激。
P.S。对不起,如果代码的缩进是杂乱的。我希望stackoverflow有一个适当的工具来复制和粘贴代码,这样就不会弄乱像这样的缩进!
edit1:根据评论我修复了代码,现在应该可以了。