2015-05-06 2 views
1

На самом деле, я хочу вызвать магму из fortran. Так что я добавить magma.lib и создать интерфейс для использования C фикцию магмы:Как использовать интерфейс Fortran для вызова функции 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, Кто-нибудь знает, как создать для него интерфейс? Заранее благодарен

ответ

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.

+0

это работает! Большое спасибо. – user3271438