Смешанный код - указатели на элементы функций - PullRequest
1 голос
/ 06 марта 2012

Я хотел бы вызвать функцию FORTRAN из моего кода C ++.Функция FORTRAN выглядит примерно так:

extern "C" { void FORTRANFUNC( void FCN(int*,double*), int *N); }

Указанная выше функция FCN является функцией-членом класса C ++

class CppClass 
{
...
void FCN(int* a, double* b);
...
};

Я хотел бы вызвать код таким образом, нокажется, что это невозможно:

FORTRANFUNC(myClass.FCN, &n_);

Компилятор жалуется, потому что функции FORTRAN хотят использовать функцию void FCN, а я передаю функцию CppClass :: void.

Можете ли вы помочьмне

1 Ответ

1 голос
/ 06 марта 2012

Указатели на функции-члены не являются указателями. Они требуют специальной обработки на сайте вызова. Поскольку код на Фортране вряд ли знаком с инструкцией, то, что вы пытаетесь сделать, невозможно. Вместо этого вы должны передать свободную функцию. Поскольку для произвольных пользовательских данных нет аргумента void*, единственный обходной путь (и я подчеркиваю, что это бесполезный обходной путь ), который у вас есть, - это использовать глобальную диспетчеризацию (ну, или создать динамический поток) , но это не так просто):

CppClass *obj;
void dispatch_fcn(int* a, double* b) {
    obj->fcn(a, b);
}

// later:
obj = &myClass;
FCN(dispatch_fcn, &n_);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...