Можно ли передать вектор указателей с ++ на фортран? - PullRequest
1 голос
/ 19 апреля 2019

Мне нужно передать вектор указателей из c ++ в dll на Фортране, и я не знаю, возможно ли это.

Я попытался найти, но не смог найти ответ на свой вопрос.Идея заключается в следующем:

Фортран сторона

!DEC$ATTRIBUTES DLLEXPORT :: TO_FORTRAN
      integer function TO_FORTRAN (test4)  BIND(C)
      use, intrinsic :: ISO_C_BINDING
      implicit none
      REAL, intent(in) :: test4(3)
      REAL, pointer :: test5
      call C_F_POINTER(C_LOC(test4),test5)
      TO_FORTRAN = 0
      END

c ++ код

std::vector<float> test1(3);
std::vector<float> test2(3);
std::vector<float> test3(3);

std::vector<float*> test4(3);

test4[0] = test1.data();
test4[1] = test2.data();
test4[2] = test3.data();
TO_FORTRAN(test4);

1 Ответ

1 голос
/ 19 апреля 2019

Если это действительно массив указателей, вам нужно обращаться с ним как с массивом указателей на стороне Фортрана. Вы также должны помнить, что они являются указателями на массивы, а не просто масштабируют действительные числа (хотя они могут быть представлены в C одинаково).

!DEC$ATTRIBUTES DLLEXPORT :: TO_FORTRAN
      integer function TO_FORTRAN (test4)  BIND(C)
        use, intrinsic :: ISO_C_BINDING
        implicit none
        type(c_ptr), intent(in) :: test4(3)
        REAL, pointer :: test1(:), test2(:), test3(:)
        call C_F_POINTER(test4(1),test1, [3])
        call C_F_POINTER(test4(2),test2, [3])
        call C_F_POINTER(test4(3),test3, [3])
        TO_FORTRAN = 0
      END FUNCTION

и

      TO_FORTRAN(test4.data());
...