LINUX.ORG.RU

как слинковать программу на С++ с фортранной

 ,


0

1

Пытаюсь подружить программу на С++ с субрутиной на фортране. Текст программ взят из Немнюгина
/*main.cpp*/
#include <iostream.h>
extern «C»
{
void __stdcall FR1(int *, int *); i
nt __stdcall FF1(int *);
}
int main ()
{
int n = 10,nSq=1, nCube=2;
FR1(&n, &nSq);
cout<< «The square is:»<<nSq<<endl;
nCube=FF1(&n);
cout<< «The Cube is:»<< nCube <<endl;
return 0;
}
/*fortran.f*/
SUBROUTINE FR1(NM)
M=N*N
RETURN
END

INTEGER FUNCTION FF1(N)
FF1=N*N*N
RETURN
END
А вот как их объеденить не знаю. Раньше никогда подобным не занималась и с линуксом начала общаться совсем недавно.


Ответ на: комментарий от Irta

Я возможно действительно задаю глупые вопросы, но хочу разобратья. Возможно не правильно применяю терминологию. я только начинаю программировать.

Irta
() автор топика
Ответ на: комментарий от Irta

Может сначала научитесь, а потом уже придете?

Вкратце ответ такой: в C++ программе объявляете прототип вызываемой фортановской сабрутины по такому правилу:

1. все объявления заворачиваете в extern «C» {}

2. Имя сабрутины в C++ будет равно имени фортрановской, написанной полностью в нижнем регистре и с подчеркиванием на конце (underscore, _). Например, LAPACK-овская фортрановская сабрутина DSYEV станет dsyev_ в C/C++

3. Все формальные аргументы фортрановской сабрутины должны быть обявлены как ссылки на соотв. C-шный тип. integer -> int*, real*8 -> double*, real -> float*

4. Если сабрутина в Фортране НЕ функция, то она должна возвращать void.

unanimous ★★★★★
()

Очевидно собрать их в объектные файлы, а потом слинковать эти файлы вместе.

buddhist ★★★★★
()
Ответ на: комментарий от unanimous

объектный файл из фортрана создала, но когда пытаюсь скомпелировать Сишный, то он выдает ошибки
main.cpp:4: error: expected initializer before ‘FR1’
main.cpp:5: error: expected initializer before ‘FF1’
main.cpp: In function ‘int main()’:
main.cpp:10: error: ‘FR1’ was not declared in this scope
main.cpp:12: error: ‘FF1’ was not declared in this scope

Irta
() автор топика
Ответ на: комментарий от unanimous

Спасибо за ответ/

У меня слинковать не получается. Все что Вы написали насколько я понимаю выполнено в выше указанных программах. как их запустить.

Зы/ а чтобы научиться мне куда пойти?

Irta
() автор топика
Ответ на: комментарий от Irta

Внимательно читали? В C имя ваших фортрановский функций — fr1_ и ff1_, соответственно.

напишите вот что (привожу пример только для первой)

extern "C" {
  void fr1_(int*);
}

И далее ее вызываете в main() как полагается. компилируете фортрановский код: g77 -c fortran.f, компилируйте с-шный, линкуете все вместе. Будете тестировать — не забудьте закомментировать все, связанное с FF1

unanimous ★★★★★
()
Ответ на: комментарий от unanimous

g77 у меня нет, есть gfortran


при компиляции сишного ошибки теже
main.cpp:4: error: expected initializer before ‘fr1_’
main.cpp:5: error: expected initializer before ‘ff1_’
main.cpp: In function ‘int main()’:
main.cpp:10: error: ‘fr1_’ was not declared in this scope
main.cpp:12: error: ‘ff1_’ was not declared in this scope

Irta
() автор топика
Ответ на: комментарий от unanimous

хорошо, но это сути дела не меняет пока.
main.cpp:4: error: expected initializer before ‘fr1_’
main.cpp: In function ‘int main()’:
main.cpp:10: error: ‘fr1_’ was not declared in this scope

Irta
() автор топика
Ответ на: комментарий от Irta

Вот такой код компиляется без проблем (g++ -c 1.cpp)

#include <iostream>

extern "C"
{
  void fr1_ (int *, int *);
  int ff1_ (int *);
}
int
main ()
{
  int n = 10, nSq = 1, nCube = 2;
  fr1_ (&n, &nSq);
  std::cout << "The square is:" << nSq << std::endl;
  nCube = ff1_ (&n);
  std::cout << "The Cube is:" << nCube << std::endl;
  return 0;
}
unanimous ★★★★★
()
Ответ на: комментарий от unanimous

Кстати, сабрутина fr1 у Вас выдает явно что-то странное — сигнатуры С-шного вызова и фортрановской имплементации не совпадают.

unanimous ★★★★★
()
Ответ на: комментарий от Irta

Огромное человеческое спасибо!

Успешного изучения! Пожалуйста, разберитесь во всем до конца и убедитесь, что все поняли.

unanimous ★★★★★
()
Ответ на: комментарий от Irta

Вот такой фортран коварный язык: вместо того, чтобы выдать честно сообщение об ошибке, он считает неизвестно что.

unanimous ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.