Проблема, с которой вы столкнулись, состоит в том, что Fortran - это регистр на языке, чувствительном к регистру.Поэтому, если у вас есть подпрограмма foo
:
subroutine foo(x)
real :: x
end subroutine foo
, вы можете вызвать ее с помощью любого из следующих действий:
call foo(x)
call FOO(x)
call fOo(x)
Когда вы создаете объектный файл или библиотеку с помощью этой функции,имя символа будет зависеть от компилятора.В случае Gfortran в системе Linux, он всегда будет указывать имя символа в нижнем регистре и добавлять подчеркивание, например
foo_
В системах Windows он будет вести себя по-другому (см. здесь и здесь ), и даже разные компиляторы будут иметь разные идеи.
Так что же теперь, что все это значит?
Это означает, что когдавы пишете вызов подпрограммы, например:
call mxIsNumeric_800(arg1, arg2, arg3)
Gfortran попытается связать его с символом mxisnumeric_800_
, а не с символом, который вы ожидаете.В прошлом это часто приводило к уродливым взломам, которые были очень непереносимы.В Fortran 2003 эта проблема решена путем введения атрибута BIND
.Атрибут, который позволяет программисту сообщать компилятору, что этот объект должен обрабатываться как не-Fortran-объект (см. раздел 15.5 стандарта F2008 ).
С помощью этого атрибута вы теперь можете определить интерфейс, который полностью понят Fortran и что компилятор знает, где найти соответствующий символ с соответствующей чувствительностью к регистру.Например,
interface
subroutine mxisnumeric(arg1,arg2,arg3) BIND(C, NAME="mxIsNumeric_800")
use, intrinsic :: iso_c_binding
implicit none
real(c_float) :: arg1
integer(c_int) :: arg2
character(c_char) :: arg3
end subroutine mxisnumeric
end interface
Более подробную информацию можно найти здесь .