포트란에서 c 함수나 서브루틴의 호출은 끝에 _를 달면 됩니다.
컴파일러에 따라서 _를 두개 다는 경우도 있고, 하나만 달때, 혹은 달지 않을 경우, 혹은 대문자로 쓸경우가 다다릅니다. 통상적으로 g77에서는 다음과 같이 하시면 됩니다.
double func_()
{
}
이런 식으로 만들고 포트란에서는
A = FUNC()
와 같이 하면 됩니다.
자세한 것은 Fortran C Calling Convention 이라는 걸로 구글에서 검색하면 많이 나옵니다.
C에서 포트란을 부르는 것은 안해봐서 잘 모르겠읍니다. 그리고, argument를 넘겨줄 때는 좀 주의를 해야했던 걸로 기억합니다. 포트란이 C와 달리 Call by Address라서 Call by Value나 Call by Reference와는 달리 신경을 좀 써라고 어디서 나와 있었던 거 같군요...
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
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
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
포트란에서 c 함수나 서브루틴의 호출은 끝에 _를 달면 됩니다.컴파일
포트란에서 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 가 좀 도움이 될듯...
--------------------------------
윈도위의 리눅스 윈도위의 윈도우 리눅스위의 익스플로러
^^ 아직 해결 못했지만 관심 가져주셔서 감사합니다.fortran 에
^^ 아직 해결 못했지만 관심 가져주셔서 감사합니다.
fortran 에서 C 호출시에 사용하는 ALIAS 같은경우는 complie 은 되는것 봐서는 아마도 링크 문제가 아닐까 생각합니다.
에휴 힘드네.... 혹시 mixed languge program 에서
에휴 힘드네....
혹시 mixed languge program 에서 컴파일은 어떻게 하시는지 아시는분...
fortran 에서 C를 호출하는건 인텔컴파일러를 사용해서 컴파일에는 문제가 없는듯 한데
C에서 fortran 호출할때가 문제네요.
//extern void chole(int, int*);
extern void chole(int, int*);
여기서 stdcall을 리눅스에서 지원을 안하니..
http://www2.maths.unsw.edu.au/ForStudent
http://www2.maths.unsw.edu.au/ForStudents/courses/math3301/Topics/mixed.pdf
참고바랍니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
..
해결 봤습니다.
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
댓글 달기