Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> процедуры fortran в Visual C++, вызов Fortran процедур на C++ 
V
    Опции темы
res2305
Дата 23.5.2012, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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;
}

Можно подробно по шагам указать, каким образом это можно сделать?


PM MAIL   Вверх
baldina
Дата 23.5.2012, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



PM MAIL   Вверх
res2305
Дата 23.5.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 ==========

Что здесь нужно исправить?
PM MAIL   Вверх
baldina
Дата 23.5.2012, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



нужно не исправить, а добавить. откомпилированный фортраном obj в список линковки программы на C++
в VisualStudio это можно сделать напрямую, указав в параметрах линкера, либо указав зависимость основного проекта от проекта на фортране (для этого оба проекта должнывходить в один Solution).
этот вопрос к фортрану прямого отношения не имеет, то же самое надо сделать, если FF1 и FR1 написаны на С++ и находятся в другом проекте

Добавлено через 1 минуту и 35 секунд
Цитата(res2305 @  23.5.2012,  13:21 Найти цитируемый пост)
в файл forc.for , который находится в той же директории проекта, что и сам проект, поместил такой текст

его надо не просто поместить, а откомпилировать.
попробуйте просто включить в проект (в состав исходных файлов) forc.for.
тогда он и компилироваться, и линковаться будет
PM MAIL   Вверх
res2305
Дата 24.5.2012, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



>его надо не просто поместить, а откомпилировать.
>попробуйте просто включить в проект (в состав исходных файлов) forc.for.
>тогда он и компилироваться, и линковаться будет 

Конечно, я его не только поместил в ту же директорию, где находится проект, но и включил Add New Item->Add Existing Item
И в проекте Solution 'forTOc' -> forTOc -> forc.for находится этот файл. И он не хочет компилироваться. В среде MS Visual Studio так же имеется возможность создать проект на фортране, но это - отдельный проект.

Уверен, что проблема решеается как-то просто, есть вещь, которую я пропустил...
Может быть файл с процедурой на фортране следует откомпилировать как-нибудь ОТДЕЛЬНО из командной строки, получить бынарник и вставить его в папку проекта /debug/? Как это сделать?
PM MAIL   Вверх
xvr
Дата 24.5.2012, 09:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Попробуйте сделать solution из 2х проектов - на Fortran'е (сделать его в виде статической библиотеки), и на С (этому проекту добавьте зависимость от 1го проекта)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2667 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.