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.

Другие вопросы по тегам