Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вызов процедур Фортран из программы на С++  (Прочитано 14223 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
res2305
Интересующийся

ru
Offline Offline

« : 23-05-2012 10:36 » 

Я работаю в среде Microsoft Visual C++ 2008 и понадобилось вызвать процедуру, написанную на фортране.

По ссылке "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:
Код: (C++)
// 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:
Код: (Fortran)
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 , который находится в той же директории проекта, что и сам проект, поместил такой текст:
Код: (Fortran)
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: в файл самого проекта поместил несколько видоизменённый вариант:
Код: (C++)
#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 ==========

Что здесь нужно исправить?
« Последнее редактирование: 23-05-2012 12:55 от Джон » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-05-2012 10:40 » 

res2305, возможно, тип проекта не тот выбран. Раз вместо main ожидается некий _wmain, значит проект не консольный. В свойствах линкера поищи subsystem и выбери console.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
res2305
Интересующийся

ru
Offline Offline

« Ответ #2 : 23-05-2012 11:12 » 

Проект изначально спроектирован как консольный...
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #3 : 23-05-2012 11:53 » 

res2305, в сам проект файл forc.for включен?
Записан
res2305
Интересующийся

ru
Offline Offline

« Ответ #4 : 23-05-2012 12:11 » 

Сам файл находится в папке проекта, а в проект я добавил его с помощью Add New Item...
Может, что-то ещё надо было сделать?
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #5 : 23-05-2012 12:42 » 

res2305, а вообще forc.obj создаётся в каталоге C:\Users\admin\Desktop\work\23052012\c_for\forTOc\Debug? Ещё вопрос - а сам компилятор фортрана установлен?
Записан
res2305
Интересующийся

ru
Offline Offline

« Ответ #6 : 23-05-2012 13:01 » 

в папке ...\debug\ я forc.bin не обнаружил. Но компилятор с Фортрана установлен. И проекты на фортране он компилирует. Но это - проекты!
А здесь один файл, который я вроде бы включил в проект...
Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #7 : 23-05-2012 13:05 » new

как вариант - попробуйте вручную его странслировать в командной строке, получить obj и уже его подключить к проекту. к сожалению точнее подсказать не смогу - никогда не писал на фортране..
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 23-05-2012 14:37 » 

Dimka, _wmain - это не про консоль/не консоль, а про юникод (_tmain в него превращается макроподстановкой)

res2305, если проект c++-ный, просто так файл в проект включить мало, надо настроить "Custom Build Steps" (или как там оно звучит) в опциях этого конкретного файла в дереве проектов, для каждой конфигурации сборки. В качестве custom step надо вписать команду вызова компилятора фортрана, с нужными опциями. По крайней мере, для ассемблерных файлов аналогично делалось.
Записан
res2305
Интересующийся

ru
Offline Offline

« Ответ #9 : 24-05-2012 04:04 » 

Как я понимаю, в Properties файла проекта forc.for "Custom Build Steps"->"Command line" -> указать команду компиляции?
Большое спасибо!
Теперь надо узнать какую команду, но это не для разработчиков C++

Добавлено через 7 минут и 30 секунд:
Но здесь к сожалению нет раздела "программирование"-> Fortran....
« Последнее редактирование: 24-05-2012 04:12 от res2305 » Записан
res2305
Интересующийся

ru
Offline Offline

« Ответ #10 : 30-05-2012 09:50 » 

Всем спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines