2015-09-30 2 views
0
subroutine func01(a) bind(C,name="func01") 
    implicit none 
    character(len=30), dimension(3) , intent(in) :: a 

    print * 
    print *, "char length = ", len(a(1)), len(a(2)), len(a(3)) 
    print *, "raw a(1) : [", a(1), "]" 
    print *, "raw a(2) : [", a(2), "]" 
    print *, "raw a(3) : [", a(3), "]" 
    print *, "trim  : [", trim(a(1)), "] [", trim(a(2)), "] [", trim(a(3)), "]" 
end 

Когда я пытаюсь скомпилировать код выше, я получаю следующие сообщения:Ошибка: Характер аргумент «а» в (1) должен быть длиной 1, так как процедура BIND (C)

gfortran source3.f90 

source3.f90:1.20: 

subroutine func01(a) bind(C,name="func01") 
        1 
Warning: Variable 'a' at (1) is a parameter to the BIND(C) procedure 'func01' bu 
t may not be C interoperable 
source3.f90:1.20: 

subroutine func01(a) bind(C,name="func01") 
        1 
Error: Character argument 'a' at (1) must be length 1 because procedure 'func01' 
is BIND(C) 

Может скажите, пожалуйста, как избавиться от сообщений?

+1

Как вы можете видеть в http://stackoverflow.com/tags/fortran-iso-c-binding/info 'a' не является совместимой вещью (это не длина 1) .. Вы будете в состоянии найти много других вопросов о передаче строки из C в Fortran. – francescalus

+0

Он отлично компилируется с помощью компилятора ifort intel – bjdesa

+2

Да, Intel позволяет это, но это их нестандартный выбор. –

ответ

2

Персонаж аргумент совместимых процедур Fortran bind(C) должен иметь длину 1.

Но можно использовать тот же подход, как и в C, использовать массивы символов.

Если у вас есть

char ch[5] 

использование

character(kind=c_char) :: ch(5) 

Если у вас есть

char* ch; 
int n; 

ch = malloc(n); 
fortran_sub(ch, n); 

использование

subroutine fortran_sub(ch, n) bind(C, name="fortran_sub") 
    integer(c_int), value :: n 
    character(kind = c_char) :: ch(n) 

Обратите внимание на то, что массив символов будет иметь нулевой ограничитель.

Если вы вызываете C и передаете массив символов, вы несете ответственность за его разграничение на c_char_null.

 Смежные вопросы

  • Нет связанных вопросов^_^