如何使用Fortran接口调用包含用户定义类型的C函数

时间:2015-05-06 13:33:57

标签: c interface fortran user-defined-types magma

事实上,我想从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,有谁知道如何为它创建界面? 提前致谢

1 个答案:

答案 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选项之后继续存在。