gpt4 book ai didi

c - 如何使用 Fortran 接口(interface)调用包含用户定义类型的 C 函数

转载 作者:太空宇宙 更新时间:2023-11-04 02:42:55 25 4
gpt4 key购买 nike

其实我想从fortran中调用magma。所以我添加了 magma.lib 并创建了一个接口(interface)来使用 magma 的 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,有人知道如何为它创建接口(interface)吗?提前致谢

最佳答案

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 选项之类的情况下继续存在。

关于c - 如何使用 Fortran 接口(interface)调用包含用户定义类型的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30078369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com