2011-12-23 4 views
22

제목이 제대로 입력되었는지 확실하지 않습니다. 제안을 환영합니다.Fortran에서 함수 이름의 별명 지정 방법

내가 원한다. 조건을 확인한 다음 루프에서 사용할 함수를 결정하십시오. 예 :

if (a < 0) then 
    loop_func = func1 
else 
    loop_func = func2 
endif 

내 루프를 작성할 때 loop_func을 포인터로 사용할 수 있습니다. 두 함수 모두 정확히 동일한 입력을 사용하며 a의 값을 기반으로 문제를 해결하기위한 다양한 접근 방식을 사용합니다. 이렇게하면 두 개의 거의 동일한 블록 대신 한 블록의 코드 만 가질 수 있습니다. 이것은 서브 루틴에도 적용될 수 있습니다.

어떻게 구현 될지 아이디어가 있으십니까?

감사합니다.

답변

31

예, 포트란에는 프로 시저 포인터가 있으므로 실제로 별칭에 함수 이름을 사용할 수 있습니다. 다음은 함수 포인터 "f_ptr"에 하나의 함수 또는 다른 함수를 할당하는 코드 예제입니다. 그 후 프로그램은 "f_ptr"을 사용할 수 있고 선택된 함수가 호출됩니다.

module ExampleFuncs 

    implicit none 

contains 

function f1 (x) 
    real :: f1 
    real, intent (in) :: x 

    f1 = 2.0 * x 

    return 
end function f1 


function f2 (x) 
    real :: f2 
    real, intent (in) :: x 

    f2 = 3.0 * x**2 

    return 
end function f2 

end module ExampleFuncs 


program test_func_ptrs 

    use ExampleFuncs 
    implicit none 

    abstract interface 
     function func (z) 
     real :: func 
     real, intent (in) :: z 
     end function func 
    end interface 

    procedure (func), pointer :: f_ptr => null() 

    real :: input 

    write (*, '(/ "Input test value: ")', advance="no") 
    read (*, *) input 

    if (input < 0) then 
     f_ptr => f1 
    else 
     f_ptr => f2 
    end if 

    write (*, '(/ "evaluate function: ", ES14.4)') f_ptr (input) 

    stop 

end program test_func_ptrs 
+0

이것은 어떤 방언입니까? – wallyk

+0

Hmm ... 그래서'=>'는 포인터에 대한 일종의 대입 연산자이고'procedure (func)'는 프로 시저에 대한 일종의 선언입니다. 예를 들어'type (mytype)'은 파생 된 유형입니다. 나는'null()'이 초기화에 사용되었다고 가정하고 있는데, 이것은 0과 같습니다. 여러분이 알 수 있듯이 저는이 초심자입니다.그리고 예, Fortran은 내가 올바르게 배우는 첫 번째 프로그래밍 언어입니다. –

+0

몇 가지 질문. 인터페이스 란 무엇입니까? 프로 시저 (파생 된 타입과 같은)를 지정하고 포인터가 가리키는 포인터가 올바른 "유형"인지 확인하는 방법입니까? 또한 프로그램이 끝나기 전에 '중지'상태가됩니다. 그게 가장 좋은 방법이고, 내 코드에도 포함시켜야 하나? –

2

대부분의 Fortran 구현에는 함수 포인터 또는 프로 시저 포인터를 조작하는 표준 방법이 없습니다. 그러나 Fortran 2003 이상은 무언가를 가지고 있습니다. (this의 6 페이지를 참조하십시오.)

주어진 상황에

이가 그 자리에 꽤 잘 작동합니다

function func1 (p1, p2, etc) 
... as you have it already 
end 

function func2 (p1, p2, etc) 
... as you have it already 
end 

function funcselect (a, p1, p2, etc) 
    if (a < 0) then 
      x = func1 (p1, p2, etc) 
    else 
      x = func2 (p1, p2, etc) 
    endif 
end 

그럼 그냥 전화 funcselect을 대신 당신이 loop_func 함께 할 것이다 일의 추가 매개 변수 .

+0

그러나 프로그램이 함수를 호출 할 때마다 조건을 확인해야합니까? 나는 그것을 피하려고 노력하고있다. –

+0

@SamuelTan : 그렇습니다.하지만 걱정할 사항은 거의 없습니다. 최신 프로세서의 경우 CPU 사이클이 몇 나노초에 불과합니다. – wallyk

+2

"Fortran에는 함수 포인터 나 프로 시저 포인터를 조작하는 표준 방법이 없습니다."라는 문구에는 동의하지 않습니다. 프로 시저 포인터는 Fortran 2003 언어 표준의 일부입니다. –