| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Fortran > [General] Подключение подпрограммы внутрь DLL. |
| Автор: nikmixtape 24.3.2010, 19:12 |
| Нужен дельный совет по поводу DLL. Уже всё перебрал Есть программа: program alfa ... ... ... ... call betta(.....) !DEC$ ATTRIBUTES DLLIMPORT :: betta .... ... ... end Делаю DLL из subroutine betta которая выгледит примерно так: subroutine betta(....) !DEC$ ATTRIBUTES DLLEXPORT :: betta ...... ...... ...... call fun(f,x) ....... ....... ...... end subroutine betta subroutine fun(f,x) ... f=x**2 ... end subroutine fun(f,x) В выше схематично показанном коде функция используется (call fun) в программе из которой делаю DLL. В этом то и беда!!!!! program alfa ... ... ... ... call betta(.....) !DEC$ ATTRIBUTES DLLIMPORT :: betta .... ... ... end subroutine fun(f,x) !Записана функция f=x**2 end subroutine fun(f,x) DLL из subroutine betta: subroutine betta(....) !DEC$ ATTRIBUTES DLLEXPORT :: betta ...... ...... ...... call fun(f,x) ....... ....... ...... end subroutine betta Компилятор пишет что нужно подключить fun Говорят можно сделать это через callback.....Подскажите если это возможно. Да и вообще возможно ли это???.....Дайте хоть маленький намёк. |
| Автор: FCM 25.3.2010, 09:44 | ||||
Пробовал задавать интерфейс-блоки с прототипами?
DLL:
|
| Автор: nikmixtape 27.3.2010, 01:07 |
| R[subroutine GLOBOPT(nsum,an1,bw1,i081,iz,optx,optf,x,kn,Fkm) !DEC$ ATTRIBUTES DLLEXPORT :: GLOBOPT INTERFACE SUBROUTINE g(nsum,x,fkm,kn) REAL, INTENT(IN) :: x !текущий x INTEGER, INTENT(IN) :: nsum ! количество неизвестных в уранении REAL, INTENT(IN) :: kn ! не стоит обращать внимание, просто домножается функция на ! kn - короче коэффициент шасштабирования REAL, INTENT(OUT) :: Fkm !значение функции END SUBROUTINE g END INTERFACE REAL, INTENT(IN) :: X INTEGER, INTENT(IN) :: nsum REAL, INTENT(IN) :: kn REAL :: Fkm do i=1, nsum call fw(nsum,i,x,ico,fg,kn) end do ...... do i=1, nsum call fww(nsum,x,ico,fkm,kn) end do ...... end subroutine fw(nsum,x,ico,fg,kn) !одна из обслуживающих подпрограмм просто избавлялся от комонов dimension fg(20),x(100) real kn ico=ico call g(nsum,x,fkm,kn) fg(i)=fkm return end subroutine fww(nsum,x,ico,fkm,kn) !одна из обслуживающих подпрограмм dimension x(100) real kn ico=ico call g(nsum,x,fkm,kn) return end] [Linking...Creating library Debug/INTER2.lib and object Debug/INTER2.exp 12.obj : error LNK2001: unresolved external symbol _G@16 Debug/INTER2.dll : fatal error LNK1120: 1 unresolved externals Error executing link.exe. ] Опять не видет подпрограмму G Мож и я конечно нахимичел, проверял раз 50 |
| Автор: FCM 27.3.2010, 09:30 |
| Непонятно, где у тебя находятся fw, fww - в dll или где-то еще. Если g вызывается в них, там ее интерфейс и задавай. (Да и сами fw, fww не совсем понятны.) Писать код следует в одном стиле, желательно не использовать неявную типизацию (см. IMPLICIT NONE) и каждый параметр подпрограмм четко прописывать. |