Я должен заменить некоторые подпрограммы на 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];
}
}
Вы смешиваете fortran
, C
жаргон vector
который относится к коллекции int
S в смежной области памяти, то есть array
с C++
«s std::vector
, std::vector
это отдельный контейнерный класс и нуждается в создании — обратитесь к документация
Вот код 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.