Fortran передает структуру C между двумя функциями C
У меня есть приложение на Фортране, которое требуется для вызова двух подпрограмм Си. Один для загрузки файла и один для запуска расчета файла около 200 раз. Я понимаю, что C DLL не может "сохранить" загруженную структуру в статической переменной для повторного использования в функции вычисления, поэтому я хочу проанализировать void* в Fortran и отправить его в функцию вычисления C.
Функции C:
__declspec(dllexport) void loadfile(void * file); // Empty pointer should be filled with struct of loaded file
__declspec(dllexport) void calculate(void * file, double * result); //filled void ptr is used (casted back to my struct first)
Мой код на Фортране:
module globalFileHolder USE, INTRINSIC::ISO_C_BINDING type(C_PTR), save :: fileModule = C_NULL_PTR end module
Процедура загрузки файла:
SUBROUTINE loadcfile()
USE, INTRINSIC::ISO_C_BINDING
use globalFileHolder
IMPLICIT NONE
INTERFACE
SUBROUTINE loadfile(fm) BIND(C)
USE, INTRINSIC::ISO_C_BINDING
TYPE(C_PTR) :: fm
END SUBROUTINE loadfile
END INTERFACE
TYPE(C_PTR) :: fms = c_null_ptr
call loadfile(fms)
fileModule = fms
return
end
И, наконец, моя процедура, которая должна использовать загруженный файл в расчете:
SUBROUTINE calculatec() USE, INTRINSIC::ISO_C_BINDING use globalFileHolder IMPLICIT NONE INTERFACE SUBROUTINE calculate(fm,res) BIND(C) USE, INTRINSIC::ISO_C_BINDING TYPE(C_PTR) , VALUE :: fm REAL(C_DOUBLE) , value :: res END SUBROUTINE calculate END INTERFACE TYPE(C_PTR) :: fms REAL(C_DOUBLE) result fms = C_LOC(fileModule) call calculate(fms,result) return end
Теперь проблема, с которой я столкнулся в настоящее время, заключается в том, что filemodule переменной модуля кажется заполненным, но при отправке его в функцию вычисления переменная становится нулевой после ее приведения, например:
myStruct * ms = (myStruct*)file;
Где я могу пойти не так?
1 ответ
Декларация fm
в пустом аргументе интерфейса для файла загрузки отсутствует атрибут VALUE.