Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 ==========

Что здесь нужно исправить?

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

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

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

Автор: 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го проекта)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)