2016-03-08 1 views
0

Я пытаюсь переместить некоторый код C в Fortran. Тем не менее, у меня возникают проблемы с получением строк переменной длины C, возвращаемых C API, в строки фиксированной длины, требуемые API Fortran.Присвоить строку переменной длины строке фиксированной длины

Вот приведенная версия кода, который не будет компилироваться - я получаю The shapes of the array expressions do not conform.

character*200 function getValueFromC() 
    use cbridge 
    implicit none 

    type(c_ptr) :: resultString 
    integer(kind=c_int) :: resultLength 
    character, pointer, dimension(:) :: string 

    call c_bridge_getValue(bridge, resultString, resultLength) 
    call c_f_pointer(resultString, string, (/ resultLength /)) 
    getValueFromC = string 
    call c_bridge_releaseString(resultString) 
end function getValueFromC 

cbridge только модуль, содержащий определения c_bridge_getValue() и c_bridge_releaseString и bridge указатель (только void*)

c_bridge_getValue() просто malloc S новую строку и возвращает его, и c_bridge_releaseString()free s память ,

Так что мой вопрос: что мне нужно сделать, чтобы назначить переменную string на getValueFromC?

+1

Всегда используйте тег fortran для вопросов Фортрана. И ваш код - Fortran2003, поэтому тэг fortran90 был неуместным. –

ответ

1

Одним из решений является цикл и назначение строковых фрагментов. Я не проверял, что это на 100% правильно, но он компилируется для меня ...

character*200 function getValueFromC() 
    use cbridge 
    implicit none 

    type(c_ptr) :: resultString 
    integer(kind=c_int) :: resultLength 
    character, pointer, dimension(:) :: string 

    call c_bridge_getValue(bridge, resultString, resultLength) 
    call c_f_pointer(resultString, string, (/ resultLength /)) 
    do i = 1, min(200, resultLength) 
    getValueFromC(i:i) = string(i) 
    end do 
    call c_bridge_releaseString(resultString) 
end function getValueFromC 
+0

Верно, проблема заключается в том, что 'getValueFromC' является символьной строкой (scalar) и' string' является массивом символов длиной 1. –

+0

Да, я бы сказал, что это допустимое решение, я делаю то же самое : https://bitbucket.org/apesteam/aotus/src/c2aafc4d76bafad7115867a6a0cd93406552a0a0/source/aot_top_module.f90?at=default&fileviewer=file-view-default#aot_top_module.f90-282 – haraldkl