Есть ли способ передать объект 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;
}
Пожалуйста, прочитайте описание тега тега https://stackoverflow.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!