Использование объекта класса C++ в Фортран 77
Есть ли способ передать объект C++ для использования с Fortran 77? Например:
C23456
program main
write (*,*) 'Hello from FORTRAN 77!'
call readstep('cube.stp'//CHAR(0),myshape)
stop
end
а затем использовать myshape в качестве объекта C++, который будет просто храниться в памяти, используемой Fortran, и просто передавать его другим функциям C++, которые фактически будут его использовать?
РЕДАКТИРОВАТЬ: Вот код C++:
extern"C" {
void readstep_(char*,void*);
}
void readstep_(char* inputFile, void* outShape){
STEPControl_Reader reader;
reader = STEPControl_Reader();
int succeed = reader.ReadFile(inputFile);
if(!succeed){
std::cout << "There was an error with the input file" << std::endl;
return;
}
reader.NbRootsForTransfer();
reader.TransferRoots();
TopoDS_Shape myShape = reader.OneShape();
TopoDS_Shape* myShapePtr = new TopoDS_Shape();
(*myShapePtr) = myShape;
outShape = myShapePtr;
return;
}
1 ответ
Решение
Пожалуйста, прочитайте описание тега тега https://stackru.com/questions/tagged/fortran-iso-c-binding чтобы получить гораздо лучшие варианты. И много вопросов и ответов там.
Я буду использовать обозначение звезды как общее расширение.
C++:
class Obj{
};
extern "C" {
void hello_();
void readstep_(char* name, Obj** ptr){
*ptr = new Obj(); //use name in the actual process
}
void pass_it_(Obj** ptr){
hello_();
delete *ptr; //some usage of the object
}
}
Он использует указатель на указатель из-за передачи по ссылке.
Фортран:
program main
integer*8 myshape
call readstep('cube.stp'//CHAR(0),myshape)
call pass_it(myshape)
end
subroutine hello
write (*,*) 'Hello from FORTRAN 77!'
end subroutine
использование integer*4
на 32-битной платформе.
(обратите внимание, что нет никаких оснований для заявления STOP)
компиляции:
g++ f77c++.f f77c++.C -lgfortran
или же
gfortran f77c++.f f77c++.C -lstdc++
> ./a.out
Hello from FORTRAN 77!