Re: Подключение DLL на фортране к проекту C++
От: Privalov  
Дата: 15.05.07 05:37
Оценка:
Здравствуйте, Pavel_O, Вы писали:

P_O>Здравствуйте.

P_O>Мне необходимо подключить DLL библиотеку написанную на фортране (библиотека скомпилина в MS FORTRAN 5.1 с одним внешним SUBROUTINE).

А он разве умеет 32-битовые DLL строить? Если не ошибаюсь, FORTRAN 5.1 выпущен где-то в 90-м или 91-м году.

P_O>В этой библиотеке мне необходимо задать около 200 переменных, описанных в COMMON блоках.


Когда в FORTRAN-е объявляется COMMON-блок, снаружи видно только его имя, а не его составляющих.
Мне в свое время приходилось связывать модули, написанные на C и на FORTRAN-е, кажется, этом же 5.1 или 5.0.
Если в FORTRAN-овской программе был объявлен COMMON-блок

P_O>например

P_O>
P_O>COMMON /O1/ P1, P2, P3(5)
P_O>


то в C-программе я делал так:

struct _O1
{
   float P1, P2, P3;
}

extern fortran _O1 O1;


У меня была не DLL, я все собирал в один EXE.


P_O>в основной программе описана структура

P_O>
P_O>struct
P_O>{
P_O> float 
P_O>  P1,
P_O>  P2,
P_O>  P3[5];
P_O>} O1;
P_O>


P_O>1) Могу ли я таким образом задаваь переменые?


P_O>
P_O>int *pVar;
P_O>(FARPROC &)pVar = GetProcAddress(hLib, "P1");
P_O>*pVar = O1.P1;
P_O>


Так — нет. Снаружи видно только имя COMMON-блока, а не его членов. Имя P1 никому ничего не скажет.

P_O>2) Могу ли я передать структуру и присвоить ее блоку COMMON


Тут нужен указатель не на int, а на структуру, которая COMMON-блок описывает. Тогда у тебя будет нормальный доступ к ее членам.

P_O>
P_O>int *pVar;
P_O>(FARPROC &)pVar = GetProcAddress(hLib, "/O1/");
P_O>*pVar = O1;
P_O>


Сдается мне, надо несколько иначе:

P_O>
P_O>O1 *pVar;
P_O>pVar = (_O1 *)GetProcAddress(hLib, "O1");
P_O>


Дальше в C-программе можно делать, как обычно:
extern fortran _O1 O1;

//............

float f()
{
  O1->P1 = 0.0f;
  return O1->P1;
}


Не уверен насчет синтаксиса C#.

Еще один момент — соглашения о связях. Я не знаю, что скажет C# при вызове функции из такой DLL. Необходимо проверять.

Ну, и то, что я тут спросонок понаписал, нужно как следует проверить. У меня под рукой нет компилятора FORTRAN. Поэтому сам не могу.
Удачи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.