事实上,我想从fortran那里召唤岩浆。所以我添加了magma.lib并创建了一个接口来使用岩浆的C函数:
Interface
Integer function magma_dpotrf(uplo, n, a, lda, info) BIND (C, NAME="magma_dpotrf")
use iso_c_binding
Implicit none
!character (c_char), value :: uplo????
integer (c_int), value ::n
real (c_double) ::a(*)
integer (c_int), value ::lda
integer (c_int)::info
end function
end Interface
但参数uplo是用户定义的类型 在C代码中(magma_uplo_t uplo):
typedef enum {
MagmaUpper = 121,
MagmaLower = 122,
MagmaUpperLower = 123,
MagmaFull = 123, /* lascl, laset */
MagmaHessenberg = 124 /* lascl */
} magma_uplo_t;
magma_int_t
magma_dpotrf(
magma_uplo_t uplo, magma_int_t n,
double *A, magma_int_t lda,
magma_int_t *info);
magma_int_t = int,有谁知道如何为它创建界面? 提前致谢
答案 0 :(得分:2)
magma_uplo_t
是一个枚举。在Fortran 2003中对它们有一些支持,但你可以非常安全地假设它是一个integer(c_int)
,它可以取值121到124.在你的情况下,它是按值传递的。
integer(c_int), value :: uplo
您实际上可以使用Fortran 2003枚举
创建常量 enum, bind( C )
enumerator :: MagmaUpper = 121, &
MagmaLower = 122, &
MagmaUpperLower = 123, &
MagmaFull = 123, &
MagmaHessenberg = 124
end enum
但变量然后您也可以尝试integer(kind=kind(MagmaUpper))
完全安全。这将在GCC的--short-enums
选项之后继续存在。