Нужна помощь: Fortran и С++
Спасибо.
Есть исходник программы на FORTRAN77. Программа считает нужные вещи, переписать 6000 строк кода не имею возможности и времени. Нужно создать графическую оболочку к этой программе в среде Borland C++. Задача, думаю, понятна: нужно обеспечить вызов из C++ процедуры на фортране, и возврат данных назад. Опишите, пожалуйста, подробно, каким образом это можно сделать. Вполне устроят и ссылки на то, где это толково описано, так сказать, "для чайников".
Спасибо.
Скомпилируй в ДЛЛ прогу на фортране.
Скомпилируй в ДЛЛ прогу на фортране.
Насколько я знаю, когда пишешь ДЛЛ, то ты указываешь явно dllexport или вроде того, а у меня код для экзешника. Так что надо чего-то другого:(
Насколько я знаю, когда пишешь ДЛЛ, то ты указываешь явно dllexport или вроде того, а у меня код для экзешника. Так что надо чего-то другого:(
А насколько я знаю, фортран компилит в те же obj файлы, что и C++. Твоя задача - скопировать obj файл в папку с проектом, переделать загодовок функции с фортрана на C++ и проинклудить его, предварительно подключив obj-файл с помощью #pragma comment(linker, "/include:имя_obj_модуля")
А насколько я знаю, фортран компилит в те же obj файлы, что и C++. Твоя задача - скопировать obj файл в папку с проектом, переделать загодовок функции с фортрана на C++ и проинклудить его, предварительно подключив obj-файл с помощью #pragma comment(linker, "/include:имя_obj_модуля")
У меня еще есть проблема, у меня obj файл в COFF формате, а я хочу написать интерфейс в Borland C++, может подскажешь, какой фортрановский компилятор мне сделает obj в формате OMF.
У меня еще есть проблема, у меня obj файл в COFF формате, а я хочу написать интерфейс в Borland C++, может подскажешь, какой фортрановский компилятор мне сделает obj в формате OMF.
Для конвертации существует утилита coff2omf.exe от Borland.
Теперь линкер не может разобрать внешнюю процедуру. Привожу свой пример:
FORTRAN77
SUBROUTINE FR1(N,M)
M=N*N
RETURN
END
INTEGER FUNCTION FF1(N)
FF1=N*N*N
RETURN
END
Borland Builder C++
extern "C"
{
void _stdcall FR1(int*,int*);
int _stdcall FF1(int*);
}
int n=10 , nSq, nCube;
FR1(&n,&nSq);
Edit1->Text = IntToStr(nSq);
nCube = FF1(&n);
Edit2->Text = IntToStr(nCube);
[Linker Error] Unresolved external 'FR1' referenced from D:\FORTRAN\TEST1\UTEST1.OBJ
[Linker Error] Unresolved external 'FF1' referenced from D:\FORTRAN\TEST1\UTEST1.OBJ
Может у кого литературка есть соответсвующая.
[COLOR=red]+ Приводя код, не стесняйтесь использовать форматирование.
[/COLOR]
kot_
Все пробовал сам разобрать, как из С++ вызывать программы на Фортране, но ничего до сих пор не получилось.
Теперь линкер не может разобрать внешнюю процедуру. Привожу свой пример:
extern "C"
{
void _stdcall FR1(int*,int*);
int _stdcall FF1(int*);
}
[Linker Error] Unresolved external 'FR1' referenced from D:\FORTRAN\TEST1\UTEST1.OBJ
[Linker Error] Unresolved external 'FF1' referenced from D:\FORTRAN\TEST1\UTEST1.OBJ
Может у кого литературка есть соответсвующая.
extern "C" писать не надо, это для библиотек. Точно линкеру obj-файл подсунул?
extern "C" писать не надо, это для библиотек. Точно линкеру obj-файл подсунул?
Все оказалось довольно бонально: конвертор coff2omf сделал мне файл из нулей. Попробовал написать dll, получилось. Но еще исходник остался, работы еще валом:)
Один из примеров, файл dot.f:
INTEGER N
REAL X(N), Y(N)
DOT=0
DO 10 I=1,N
10 DOT=DOT+X(I)*Y(I)
END
Ошибка следующая:
[color=red]dot.f:
dot:
Warning on line 6: missing final end statement
I/O error on c_file[/color]
Может кто пользовался этой утилткой, скажите в чем дело?