Использование объекта класса 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://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!
5

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


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