Как вызвать функцию C ++ из Fortran 77, используя std :: vector в качестве аргументов?

Я должен заменить некоторые подпрограммы на Fortran функциями C ++. Так как литература плохая, я застрял с проблемой, подобной следующей.

Мой код всегда выдает ошибку:

Программа получила сигнал SIGSEGV: Ошибка сегментации — недопустимая ссылка на память.

Это мой код на Фортране:

  PROGRAM vector_adder
IMPLICIT NONE

INTEGER,DIMENSION(3) :: a,b,c
INTEGER :: i

!C fill vectors with values
DO i = 1,3
a(i) = i
b(i) = i
END DO

CALL ADD_VECTORS(a,b,c)

WRITE(*,'(I5,I5,I5)') (c(i),i =1,3)

STOP
END PROGRAM

Рабочий код C:

void add_vectors_(int (*a)[3], int (*b)[3], int (*c)[3])
{
for(int i = 0; i<3 ; i++)
{
(*c)[i] =(*a)[i] + (*b)[i];
}
}

И я хотел бы подобный в C ++:

extern "C" void add_vectors_(std::vector<int> *a, std::vector<int> *b, std::vector<int> *c)
{
for(int i = 0; i<a->size() ; i++)
{
(*c)[i] =(*a)[i] + (*b)[i];
}
}

1

Решение

Вы смешиваете fortran, C жаргон vector который относится к коллекции intS в смежной области памяти, то есть array с C++«s std::vector, std::vector это отдельный контейнерный класс и нуждается в создании — обратитесь к документация

-2

Другие решения

Вот код C ++, который вы можете вызвать из FORTRAN

extern "C" void add_vectors_(int(*a)[3], int(*b)[3], int(*c)[3])
{
for (size_t i = 0; i<3; i++)
{
(*c)[i] = (*a)[i] + (*b)[i];
}
}

std::vector<> не имеет переносимого интерфейса, позволяющего вызывать его из другого не-C ++ кода; поскольку это шаблон, сделать это будет сложно. (На самом деле, могут быть даже проблемы с std::vector совместимость между разными версиями компилятора или разными компиляторами в одной системе.)

Вам может понравиться что-то похожее на C ++ 17 string_view за vector<>, но такая вещь не является частью стандартной библиотеки. Обратите внимание, что многие стандартные процедуры библиотеки начать а также конец аргументы, которые хорошо работают с кодом в стиле C.

2

По вопросам рекламы [email protected]