Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Interop] Указатель на функцию. 
V
    Опции темы
euph0ria
Дата 30.11.2005, 04:57 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

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

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

Это сообщение отредактировал(а) euph0ria - 30.11.2005, 05:41
  Вверх
Cr@$h
  Дата 9.12.2005, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41



Посмотри пример использования 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
PM MAIL ICQ   Вверх
mistral
Дата 22.12.2007, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 22.12.2007

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.