C-->Frotran, Fortran-->C 호출을 linux에서는어떻게하나

agalipa의 이미지

C-->Frotran, Fortran-->C 호출을 windows 환경에서는 __stdcall 과 C, ALIAS 를 사용하여 가능한데... Linux 에서는 어떻게 하는지 모르겠네요.
예제를 들어서 설명해주세요.
근데 글제목끝에 '요'자를 적을수가 없네요.. ㅡㅡ

mycluster의 이미지

포트란에서 c 함수나 서브루틴의 호출은 끝에 _를 달면 됩니다.
컴파일러에 따라서 _를 두개 다는 경우도 있고, 하나만 달때, 혹은 달지 않을 경우, 혹은 대문자로 쓸경우가 다다릅니다. 통상적으로 g77에서는 다음과 같이 하시면 됩니다.

double func_()
{

}

이런 식으로 만들고 포트란에서는

A = FUNC()

와 같이 하면 됩니다.
자세한 것은 Fortran C Calling Convention 이라는 걸로 구글에서 검색하면 많이 나옵니다.

C에서 포트란을 부르는 것은 안해봐서 잘 모르겠읍니다. 그리고, argument를 넘겨줄 때는 좀 주의를 해야했던 걸로 기억합니다. 포트란이 C와 달리 Call by Address라서 Call by Value나 Call by Reference와는 달리 신경을 좀 써라고 어디서 나와 있었던 거 같군요...

http://www.mcsr.olemiss.edu/bookshelf/doc/pgiws_ug/pgi31u07.htm#Heading82 가 좀 도움이 될듯...

--------------------------------
윈도위의 리눅스 윈도위의 윈도우 리눅스위의 익스플로러

agalipa의 이미지

^^ 아직 해결 못했지만 관심 가져주셔서 감사합니다.
fortran 에서 C 호출시에 사용하는 ALIAS 같은경우는 complie 은 되는것 봐서는 아마도 링크 문제가 아닐까 생각합니다.

익명 사용자의 이미지

에휴 힘드네....
혹시 mixed languge program 에서 컴파일은 어떻게 하시는지 아시는분...

fortran 에서 C를 호출하는건 인텔컴파일러를 사용해서 컴파일에는 문제가 없는듯 한데
C에서 fortran 호출할때가 문제네요.

//extern void chole(int, int*);
extern void chole(int, int*);
여기서 stdcall을 리눅스에서 지원을 안하니..

agalipa의 이미지

해결 봤습니다.
http://owen.sj.ca.us/rkowen/howto/FandC/FandC.call.html

f2c.f calls f2cfn.c

--------------------------------------------------------------------------------

PROGRAM F2C
C
CHARACTER*32 NAME
INTEGER AGE
REAL TEMP
C
NAME = "Knut"
C add null character at end for portable & safe handling by C
NAME(LEN(NAME):LEN(NAME)) = CHAR(0)
C note that LEN(NAME) = 32 in this case
AGE = 4
TEMP = 98.6
CALL NAMEAGE(NAME, AGE, TEMP)
END

--------------------------------------------------------------------------------

f2cfn.c called by f2c.f

--------------------------------------------------------------------------------


#include <string.h>
#ifdef _CRAY
# include <fortran.h>
# define nameage NAMEAGE
#else
# if !defined(_AIX) && !defined(__hpux)
# define nameage nameage_
# endif
# define _fcd char *
# define _fcdtocp(a) (a)
# define _fcdlen(a) strlen(a)
#endif

void nameage(_fcd name, int *age, float *temp) {
char *cp;
size_t len;

cp = _fcdtocp(name); /* convert to C char* */
len = _fcdlen(name);

/* strip trailing blanks */
while (cp[len-1] == ' ' || cp[len-1] == '\0') --len;
printf("Hello %.*s, who is %d years old, "
"has a temperature of %4.1f\n", len, cp, *age, *temp);
}

Compilation Steps for the Above Example
Cray - PVPs - UNICOS
cc -c f2cfn.c
cf77 f2c.f f2cfn.o
(or substitute f90 for cf77)
IBM - SP2 - AIX
xlc -c f2cfn.c
xlf f2c.f f2cfn.o
SGI - IRIX
gcc -c f2cfn.c
f77 f2c.f f2cfn.o
SUN - SunOS
gcc -c f2cfn.c
f77 f2c.f f2cfn.o
HP - UX
gcc -c f2cfn.c
f77 f2c.f f2cfn.o
PC - Linux
gcc -c f2cfn.c
g77 f2c.f f2cfn.o
Output for the Above Example
Hello Knut, who is 4 years old, has a temperature of 98.6

--------------------------------------------------------------------------------

c2f.c calls c2ffn.f

--------------------------------------------------------------------------------


#include <string.h>
#ifdef _CRAY
# include <fortran.h>
# define nameage NAMEAGE
#else
# if !defined(_AIX) && !defined(__hpux)
# define nameage nameage_
# endif
# define _fcd char *
# define _cptofcd(a,b) (a)
# define _fcdlen(a) strlen(a)
#endif

void nameage(_fcd name, int *nlen, int *age, float *temp);

int main() {
char *name = "Knut";
_fcd fp;
int nlen,age = 4;
float temp = 98.6;

nlen = strlen(name);
fp = _cptofcd(name, nlen); /* convert to Fortran string */

nameage(fp, &nlen, &age, &temp);
return 0;
}

--------------------------------------------------------------------------------

c2ffn.f called by c2f.c

--------------------------------------------------------------------------------

SUBROUTINE NAMEAGE(NAME, NLEN, AGE, TEMP)
CHARACTER*(*) NAME
INTEGER NLEN,AGE
REAL TEMP
C
WRITE(6,1000) NAME(1:NLEN),AGE,TEMP
1000 FORMAT(1X,'Hello ',A,', who is ',I2,
. ' years old, has a temperature of ', f4.1)
RETURN
END

Compilation Steps for the Above Example
To discover which libraries are necessary for Fortran modules, compile a short Fortran test program and add the -V or -v option (or whatever) to get a verbose execution listing to show what arguments are being passed to each compilation stage.
Cray - PVPs - UNICOS
cf77 -c c2ffn.f
cc -c c2f.c
cf77 c2f.o c2ffn.o
(or substitute f90 for cf77)
IBM - SP2 - AIX
xlf -c c2ffn.f
cc c2f.c c2ffn.o -lxlf90 -lxlf -lm
SGI - IRIX
f77 -c c2ffn.f
gcc c2f.c c2ffn.o -lF77 -lm -lU77 -lI77 -lisam -lmpc -lc
SUN - SunOS
f77 -c c2ffn.f
gcc c2f.c c2ffn.o -L/usr/lang/SC0.0 -lF77 -lm -lc
HP - UX
f77 -c c2ffn.f
gcc c2f.c c2ffn.o -lcl -lisamstub -lc
PC - Linux
g77 -c c2ffn.f
gcc -c c2f.c
g77 c2f.o c2ffn.o
Output for the Above Example
Hello Knut, who is 4 years old, has a temperature of 98.6

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.