| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > процедуры fortran в Visual C++ |
| Автор: res2305 23.5.2012, 11:01 |
| Работаю в среде Microsoft Visual Studio 2008 и пишу на Visual C++. В среде также предустановлен Fortran. Необходимо взять процедуру, написанную на Фортране и вызвать её из программы, которую я пишу на C. В инете находится куча примеров для разных компиляторов и сред, но каждый пример имеет свои условности. Я не хочу углубляться в дебри, нужно решить простую задачу: В файле forc.for есть простая подпрограмма SUBROUTINE FSUB() ! проще некуда END и надо её вызвать из из главной процедуры //#include <fortran.h> /* пробовал использовать сведения из обного руководства */ #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { //FSUB(); /*как-нибудь так*/ return 0; } Можно подробно по шагам указать, каким образом это можно сделать? |
| Автор: baldina 23.5.2012, 11:37 |
| http://www.neurophys.wisc.edu/comp/docs/notes/not017.html#fcall |
| Автор: res2305 23.5.2012, 13:21 |
| Хорошо, я пошел по ссылке "http://www.neurophys.wisc.edu/comp/docs/no...t017.html#fcall" там есть пример: The following sample shows how Fortran routines and functions can be called from a C++ program. (1) The C++ file: // This illustrates how a Fortran routine and function may be // called from a main program in C++ #include <iostream.h> extern "C" { void __stdcall FR1(int*,int *); int __stdcall FF1(int *); } int main() { int n=10,nSq,nCube; FR1(&n,&nSq); cout << "The square is:" << nSq << endl; nCube=FF1(&n); cout << "The Cube is:" << nCube << endl; return 0; } (2) The Fortran File: SUBROUTINE FR1(N,M) C COMPUTES THE SQUARE OF N, RETURNS IN M M=N*N RETURN END C INTEGER FUNCTION FF1(N) C COMPUTES THE CUBE OF N FF1=N*N*N RETURN END Я сделал следующее: 1: в файл forc.for , который находится в той же директории проекта, что и сам проект, поместил такой текст: SUBROUTINE FR1(N,M) C COMPUTES THE SQUARE OF N, RETURNS IN M M=N*N RETURN END C INTEGER FUNCTION FF1(N) C COMPUTES THE CUBE OF N FF1=N*N*N RETURN END 2: в файл самого проекта поместил несколько видоизменённый вариант: #include <stdio.h> #include "stdafx.h" extern "C" { void __stdcall FR1(int*,int *); int __stdcall FF1(int *); } int _tmain(int argc, _TCHAR* argv[]) { int n=10,nSq,nCube; FR1(&n,&nSq); printf("The square is:%d\n",nSq ); //cout << "The square is:" << nSq << endl; nCube=FF1(&n); printf("The Cube is:%d\n",nCube ); //cout << "The Cube is:" << nCube << endl; return 0; } 3: после неудачной компиляции на выходе получил : 1>Linking... 1>forTOc.obj : error LNK2019: unresolved external symbol _FF1@4 referenced in function _wmain 1>forTOc.obj : error LNK2019: unresolved external symbol _FR1@8 referenced in function _wmain 1>C:\Users\admin\Desktop\work\23052012\c_for\forTOc\Debug\forTOc.exe : fatal error LNK1120: 2 unresolved externals 1>Build log was saved at "file://c:\Users\admin\Desktop\work\23052012\c_for\forTOc\Debug\BuildLog.htm" 1>forTOc - 3 error(s), 0 warning(s) ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Что здесь нужно исправить? |
| Автор: res2305 24.5.2012, 06:57 |
| >его надо не просто поместить, а откомпилировать. >попробуйте просто включить в проект (в состав исходных файлов) forc.for. >тогда он и компилироваться, и линковаться будет Конечно, я его не только поместил в ту же директорию, где находится проект, но и включил Add New Item->Add Existing Item И в проекте Solution 'forTOc' -> forTOc -> forc.for находится этот файл. И он не хочет компилироваться. В среде MS Visual Studio так же имеется возможность создать проект на фортране, но это - отдельный проект. Уверен, что проблема решеается как-то просто, есть вещь, которую я пропустил... Может быть файл с процедурой на фортране следует откомпилировать как-нибудь ОТДЕЛЬНО из командной строки, получить бынарник и вставить его в папку проекта /debug/? Как это сделать? |
| Автор: xvr 24.5.2012, 09:31 |
| Попробуйте сделать solution из 2х проектов - на Fortran'е (сделать его в виде статической библиотеки), и на С (этому проекту добавьте зависимость от 1го проекта) |