2009-08-26 5 views
2

입력 및 출력을 인수로 사용하는 Fortran에서 함수를 작성하려면 어떻게해야합니까? 예 :Fortran 함수 및 반환 값

fun(integer input,integer output) 

출력 값을 사용하고 싶습니다. 이런 식으로 시도했지만 출력 변수가 값을 보유하지 않습니다.

특히 Fortran에서 입력 및 출력을 매개 변수로 사용하는 C 함수를 호출했습니다. 입력 값을 성공적으로 전달할 수 있지만 출력 변수는 값을 가져 오지 않습니다.

+1

포트란과 C 서명을 붙여 넣을 수 있습니까 –

답변

4

당신의 fun()는 나 같은 Fortran 프로그래머가 SUBROUTINE를 호출하는 것입니다 (예, 우리는 Fortran-town에서도 키워드를 외쳤습니다).

sin_of_x = sin(x) 

그래서 첫 번째 결정은 당신의 포트란 코드가 소요됩니다 접근 : 함수는 같은 값을 돌려주는 것입니다. 아마도 SUBROUTINE를 사용하려고합니다. 그런 다음 인수의 의도를 정리하십시오.

3

예. void를 반환하는 함수를 원하면 대신 서브 루틴을 사용해야합니다.

function foo(input, output) 
    implicit none 
    integer :: foo 
    integer, intent(in) :: input 
    integer, intent(out) :: output 

    output = input + 3 
    foo = 0 
end function 

program test 
    implicit none 
    integer :: a, b, c, foo 

    b = 5 
    a = foo(b, c) 

    print *,a,b, c 

end program 

C 루틴을 호출하는 경우 서명은 참조를 사용합니다.

$ cat test.f90 
program test 
    implicit none 
    integer :: a, b, c, foo 

    b = 5 
    a = foo(b, c) 

    print *,a,b, c 

end program 

$ cat foo.c 
#include <stdio.h> 
int foo_(int *input, int *output) { 
    printf("I'm a C routine\n"); 
    *output = 3 + *input; 

    return 0; 
} 


$ g95 -c test.f90 
$ gcc -c foo.c 
$ g95 test.o foo.o 
$ ./a.out 
I'm a C routine 
0 5 8 

문자열을 사용하면 문제가 생깁니다.

+0

포트란 함수와 서브 루틴 사이에 유일한 실제적인 차이점은 서브 루틴이 값을 반환하지 않는다는 것입니까? – naught101

+0

@ naught101 : 아니요, 다른 차이점이 있습니다. 그러나 2 년 동안 녹이 슬었으므로 더 이상 세부 사항을 기억하지 못합니다. –