Здравствуйте, 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>
Так — нет. Снаружи видно только имя COMMON-блока, а не его членов. Имя P1 никому ничего не скажет.
P_O>2) Могу ли я передать структуру и присвоить ее блоку COMMON
Тут нужен указатель не на int, а на структуру, которая COMMON-блок описывает. Тогда у тебя будет нормальный доступ к ее членам.
P_O>
Здравствуйте, Privalov, Вы писали:
P>А он разве умеет 32-битовые DLL строить? Если не ошибаюсь, FORTRAN 5.1 выпущен где-то в 90-м или 91-м году.
Да, FORTRAN 5.1 не умеет строить 32 DLL. Поэтому я собрал новую библиотеку в Intel Fortran
P>extern fortran _O1 O1;
P>
"Директива _fortran больше не поддерживается. Для функций ее необходимо заменить на __stdcall."
P>У меня была не DLL, я все собирал в один EXE.
а не могли бы Вы описать это подробнее? Или дать ссылку на пример, документацию.. Именно сборки фортрана и С.
P>Сдается мне, надо несколько иначе: P_O>>
Здравствуйте, Pavel_O, Вы писали:
P_O>"Директива _fortran больше не поддерживается. Для функций ее необходимо заменить на __stdcall."
Значит, отстал я от жизни. Да, здесь речь идет не о функции, а о глобальной переменной, к тому же, сидящей в DLL. Так что тут особо можно не волноваться. Там дальше GetProcAddress пустой адрес возвращает, так это из-за того, что имя неправильно указано, возможно, его экспортировать надо.
P_O>а не могли бы Вы описать это подробнее? Или дать ссылку на пример, документацию.. Именно сборки фортрана и С.
Делал я эту сборку очень давно. Использовал MS FORTRAN 5.x MS и C 6.0 (не Visual!). Все делал в среде MS DOS.
Всю информацию добыл из документации к C и FORTRAN, попавшую к нам в бумажном виде из Болгарии (Правец-16 слышал? ), протоколов трансляции и сборки. Даже подробно это записал (нужно было для отчета по теме в НИИ, где я тогда работал). Попробую дома поискать вечером, правда, шансов немного: диски менял несколько раз и т. п. Обнадеживать не буду.
Поскольку я делал один EXE, выглядело это примерно так:
COMMON /CA/ A, B, C
SUBROUTINE FA(W)
REAL W
.......
RETURN
END
struct A
{
float a;
float b;
float c;
}
extern fortran A CA;
void fortran fa(float w);
void main()
{
float a = 0.0f;
fa(a);
}
Make-файл создавался в среде Programmer's WorkBench автоматически. Собственно, эту среду я использоват только и исключительно для создания make-файлов, она слишком неповоротлива для работы.
В случае с DLL достаточно получить адрес COMMON-блока.
Грабли со строками из-за разной трактовки строк в C и FORTRANе. Обходится, в общем, просто, но деталей уже не помню, а вводить в заблуждение не хочется.
Вообще, там все сложности — технические. Если доступны все исходники, то все решается правильными объявлениями, экспортом, установкой атрибутов.
P_O>Вызов GetProcAddress возвращает пустой адрес.
См. выше.
Еще раз удачи. И тщательно проверь, чего я настрочил. Правда, уже я проснулся и даже приступил к работе.