Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [General] Подключение подпрограммы внутрь DLL. Проблема с организацией DLL 
:(
    Опции темы
nikmixtape
  Дата 24.3.2010, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нужен дельный совет по поводу DLL. Уже всё перебрал smile . Ближе к делу.
Есть программа:
     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. В этом то и беда!!!!! smile  Задача: Сделать так чтобы функция задавалась в программе которая использует DLL, но обращение оставалось к ней внутри 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.....Подскажите если это возможно. Да и вообще возможно ли это???.....Дайте хоть маленький намёк.  smile  Всё упирается только лишь в это.









PM MAIL   Вверх
FCM
Дата 25.3.2010, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Пробовал задавать интерфейс-блоки с прототипами?


Код

PROGRAM Q
   INTERFACE
       SUBROUTINE FUN(F,X)
           INTEGER, INTENT(IN)  ::  X
           INTEGER, INTENT(OUT) ::  F
       END SUBROUTINE FUN
       SUBROUTINE DLL_SUBD(G,X)
          !DEC$ ATTRIBUTES DLLIMPORT::DLL_SUBD
          INTERFACE
             SUBROUTINE G(F,X)
                INTEGER, INTENT(IN)  ::  X
                INTEGER, INTENT(OUT) ::  F
             END SUBROUTINE G
          END INTERFACE
          INTEGER, INTENT(IN) ::  X
      END SUBROUTINE DLL_SUBD
   END INTERFACE
 
   CALL DLL_SUBD( FUN, 2 )

END PROGRAM Q

SUBROUTINE  FUN(F,X)
   INTEGER, INTENT(IN)  ::  X
   INTEGER, INTENT(OUT) ::  F
   F = X*X
END SUBROUTINE FUN


DLL:

Код

SUBROUTINE DLL_SUBD(G,X)

   !DEC$ ATTRIBUTES DLLEXPORT::DLL_SUBD
   INTERFACE
      SUBROUTINE G(F,X)
         INTEGER, INTENT(IN)  ::  X
         INTEGER, INTENT(OUT) ::  F
      END SUBROUTINE G
   END INTERFACE
   INTEGER, INTENT(IN)  ::  X
   INTEGER ::  R

   CALL G(R,X) 
   WRITE(*,*) R

END SUBROUTINE DLL_SUBD


Это сообщение отредактировал(а) FCM - 25.3.2010, 12:44
PM MAIL   Вверх
nikmixtape
  Дата 27.3.2010, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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 smile 
Мож и я конечно нахимичел, проверял раз 50
PM MAIL   Вверх
FCM
Дата 27.3.2010, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Непонятно, где у тебя находятся fw, fww - в dll или где-то еще.
Если g вызывается в них, там ее интерфейс и задавай.
(Да и сами fw, fww не совсем понятны.)
Писать код следует в одном стиле, желательно не использовать неявную типизацию (см. IMPLICIT NONE) и каждый параметр подпрограмм четко прописывать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




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


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

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