![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| res2305 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 23.5.2012 Репутация: нет Всего: нет |
Работаю в среде 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 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
||||
|
||||
| res2305 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 23.5.2012 Репутация: нет Всего: нет |
Хорошо, я пошел по ссылке "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 ========== Что здесь нужно исправить? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
нужно не исправить, а добавить. откомпилированный фортраном obj в список линковки программы на C++
в VisualStudio это можно сделать напрямую, указав в параметрах линкера, либо указав зависимость основного проекта от проекта на фортране (для этого оба проекта должнывходить в один Solution). этот вопрос к фортрану прямого отношения не имеет, то же самое надо сделать, если FF1 и FR1 написаны на С++ и находятся в другом проекте Добавлено через 1 минуту и 35 секунд
его надо не просто поместить, а откомпилировать. попробуйте просто включить в проект (в состав исходных файлов) forc.for. тогда он и компилироваться, и линковаться будет |
|||
|
||||
| res2305 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 23.5.2012 Репутация: нет Всего: нет |
>его надо не просто поместить, а откомпилировать.
>попробуйте просто включить в проект (в состав исходных файлов) forc.for. >тогда он и компилироваться, и линковаться будет Конечно, я его не только поместил в ту же директорию, где находится проект, но и включил Add New Item->Add Existing Item И в проекте Solution 'forTOc' -> forTOc -> forc.for находится этот файл. И он не хочет компилироваться. В среде MS Visual Studio так же имеется возможность создать проект на фортране, но это - отдельный проект. Уверен, что проблема решеается как-то просто, есть вещь, которую я пропустил... Может быть файл с процедурой на фортране следует откомпилировать как-нибудь ОТДЕЛЬНО из командной строки, получить бынарник и вставить его в папку проекта /debug/? Как это сделать? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Попробуйте сделать solution из 2х проектов - на Fortran'е (сделать его в виде статической библиотеки), и на С (этому проекту добавьте зависимость от 1го проекта)
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |