unni
Newbie | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору akaGM, создал код по аналогии: Код dll на Фортране... Всё компилируется, но пока проверить работу не могу, поскольку мне ещё нужна одна сложная вещь. Функция CreateUserFunction() регистрирует в Mathcad пользовательскую функцию на Fortran, при этом функция будет вызываться в стиле C из Mathcad напрямую. Для этого вторым параметром в функцию передаётся указатель на структуру такого вида: Код: // use this structure to create a function #define MAX_ARGS 10 typedef LRESULT (* LPCFUNCTION ) ( void * const, const void * const, ... ); typedef struct tagFUNCTIONINFO { char * lpstrName; char * lpstrParameters; char * lpstrDescription; LPCFUNCTION lpfnMyCFunction; long unsigned int returnType; unsigned int nArgs; long unsigned int argType[MAX_ARGS]; } FUNCTIONINFO; | Как можно в Фортран задать такой вид структуры FUNCTIONINFO? Больше всего интересует поле LPCFUNCTION lpfnMyCFunction. И вообще, в Фортране возможно описание типа - указатель на функцию с переменным количеством аргументов? Добавлено: У меня там ошибка, описывать функцию CreateUserFunction() нужно так: Код: ! const void * CreateUserFunction( HINSTANCE, FUNCTIONINFO * ); integer( LPVOID ) function CreateUserFunction( hInstance, pFunctionInfo ) use ifwin integer( HANDLE ), intent( in ) :: hInstance integer( LPVOID ), intent( in ) :: pFunctionInfo end function CreateUserFunction | Я пока поставил заглушку LPVOID, а должен быть указатель на структуру FUNCTIONINFO. Может быть не обязательно иметь указатель на тип-функцию с переменным количеством параметров. Достаточно просто указатель на функцию в структуре поместить, но сама функция на Фортран должна быть написана так, как-будто это функция в стиле С. Добавлено: Вот новая реализация, я чуток дописал: Исходник dll на Фортране Проблема в том, что я пока не понял как указать в структуре, что я передаю указатель на функцию mcad_TestFunc1(): Код: Info_mcad_TestFunc1%lpstrName = "TestFunc1"C Info_mcad_TestFunc1%lpstrParameters = "(x) - parameter"C Info_mcad_TestFunc1%lpstrDescription = "Fortran test function"C !Info_mcad_TestFunc1%lpfnMyCFunction = ? Info_mcad_TestFunc1%returnType = 1 Info_mcad_TestFunc1%nArgs = 1 Info_mcad_TestFunc1%argType(1) = 1 pInfo => Info_mcad_TestFunc1 ! Регистрируем функции библиотеки (пользовательские) Res = CreateUserFunction( hinstDll, pInfo ) | Нужно вот тут что-то дописать: !Info_mcad_TestFunc1%lpfnMyCFunction = ? Ещё интересно было бы узнать как объявить функцию как cdelc: Код: integer (4) function mcad_TestFunc1( ReturnValue, Arg0 ) use ifwin use mcadincl implicit none type ( COMPLEXSCALAR ), intent( out ) :: ReturnValue type ( COMPLEXSCALAR ), intent( in ) :: Arg0 ReturnValue%Re = Arg0%Re ReturnValue%Im = Arg0%Im ! Инициализируем значение функции признаком успешного завершения ! работы (см. The Developer's Reference в справке Mathcad) mcad_TestFunc1 = 0 end function mcad_TestFunc1 |
|