Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [Interop] Указатель на функцию.


Автор: euph0ria 30.11.2005, 04:57
В в функцию dll-модуля, написанного на Фортране, из с-программы передается указатель на функцию.
Вопрос: как в фотране объявить указатель на функцию (например, типа void fn(char* psz);) и вызывать ее через него после его инициализации?

Если же такое сделать принципиально невозможно, то как лучше здесь выкрутиться, чтобы можно было передавать строки в с-клиент?

Заранее спасибо;)

Автор: Cr@$h 9.12.2005, 20:47
Посмотри пример использования callback-функции.
Callback-функциями называют те, которые ты передаешь в dll-процедуры как параметры.
Пусть у нас есть процедура в Dll, написанная на фортране:
Код

function FMin( ax, bx, F, tol )
    !DEC$ ATTRIBUTES DLLEXPORT, STDCALL, DECORATE, ALIAS : "FMin" :: FMin

    Interface
        function F( x )
            !DEC$ ATTRIBUTES STDCALL :: F
        
            real F
            real, intent(in) :: x
        end function F
    end interface
        
    real FMin
    real, intent(in) :: ax, bx, tol

    ...
end function FMin

Здесь я использовал директивы: STDCALL -- для выполнения стандратных соглашений о вызовах, DECORATE -- компилятор автоматически думает, ставить ли перед именем процедуры _, ALIAS -- задает имя процедуры, под которым оно будет храниться в Dll, с учетом уже регистра. Сама Callback-функция описывается в интерфейсе.
Вот как обращаться к такой функции из C++:
Код

#include "stdafx.h"

extern "C" __declspec(dllimport) float __stdcall FMin( float ax, float bx, float (__stdcall *F)( float x ), float tol );

float __stdcall F( float x ) {
    return( float(x*( x*x - 2. ) - 5.) );
}

int _tmain( int argc, _TCHAR *argv[] ) {
    float a, b, z, tol;
    
    a = 0.;
    b = 1.;
    tol = 1.e-5f;
    z = FMin( a, b, &F, tol );
    printf( "z = %f", z );

    getchar();
    return 0;
}


В extern объявляю прототип вызываемой Dll-функции. Обрати внимание, как там описана функция-параметр. Затем идет пример функции-параметра и пример вызова. И везде указания на стандартное соглашение о вызовах.
В твоем случае думаю, что могут возникнуть сложности с передачей самих строк как параметров. Ведь фортран будет использовать функцию-параметр и при ее вызове подставлять какую-то свою строку, в своем понятии. Если получалось просто строки передавать, то и с их передачей в callback-функции сложностей не должно возникнуть.
Это пример работал у меня на Intel Fortran Compiler 9.0 и Visual Studio 2003 (C++). Некоторые вопросы можно посмотреть в спец. главе хелпа к указанному Фортрану.
Я работал в области многоязыкового программирования. Если возникнут сложности -- пиши. smile С передачей строк еще не приходилось иметь дела. smile
Прошу прощения, что так поздно отвечаю -- почему-то оповещение для этой темы не пришло на мыло. smile

Автор: mistral 22.12.2007, 10:02
Цитата(Cr@$h @ 9.12.2005,  20:47)
Вот как обращаться к такой функции из C++:

а как выглядит  smile пример вызова ф-ии или процедуры из dll-библиотеки Fortran в Delphy. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)