Как передать строку с помощью fortran в const char * в c ++, используя привязку fortran- C? - PullRequest
1 голос
/ 14 апреля 2020

Мне нужно передать строку, известную во время компиляции, из fortran в библиотеку c ++. Ни одна из страниц в моих результатах поиска не затрагивала это особое различие. Вот как выглядит код в настоящее время:

Fortran:

subroutine fci_wmm_associate_variable(array_name, array_pointer)
    implicit none
    character*100, intent(in), value       :: array_name
    type (c_ptr), intent(in)        :: array_pointer
    interface
        subroutine wmm_associate_variable(name_f, pointer_f) bind (c)
            use iso_c_binding
            character (c_char), intent(in)  :: name_f
            type (c_ptr), intent(in), value :: pointer_f
        end subroutine wmm_associate_variable
    end interface
    call wmm_associate_variable(array_name, array_pointer)
end subroutine fci_wmm_associate_variable

C ++:

void wmm_associate_variable(char* varname, double* var_pointer)
{
    //do stuf
}

Это прекрасно компилируется, но моей библиотеке нужна функция C ++ для просмотра следующим образом:

void wmm_associate_variable(const char* varname, double* var_pointer)
{
    //do stuf
}

Когда это происходит, я получаю неопределенную ссылку:

undefined reference to `wmm_associate_variable'

Как мне заставить это работать для const char *?

1 Ответ

2 голосов
/ 14 апреля 2020

Функция взаимодействия Fortran- C работает с функциями C, следовательно, функция C ++ должна быть объявлена ​​с помощью C linkage (extern "C").

(Обратите внимание на объявление Fortran в C функция имеет первый аргумент в качестве скалярного типа символов по умолчанию с длиной c_char - вам, скорее всего, нужно, чтобы это был тип c_char, длина одного предполагаемого размера массива - character (KIND=c_char), intent(in) :: name_f(*))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...