2017-05-06 3 views
0

함수를 서브 루틴에 대한 인수로 올바르게 전달하는 데 문제가 있습니다.함수`f`는 Fortran 서브 루틴에 대한 인수로 전달 될 때 암시 적 타입이 없습니다.

처음에는 단일 .f90 파일로 프로그램을 작성했지만 CodeBlocks로 전환해야했기 때문에 모듈을 별도의 파일로 분할해야했습니다.

프로그램은 "find_root"라는 서브 루틴을 호출하는 "diff_eq.f90"모듈을 사용합니다. 이 서브 루틴은 "roots.f90"이라는 다른 모듈에 상주합니다. 또 다른 모듈 명 "wdstar.f90"에 정의되는 함수이다 "df 명령 F"

module diff_eq 
contains 
    function solve_star([bunch of arguments]) result(r) 
    use roots 
    real(8) :: r,[bunch of arguments] 
    call find_root(f,df,[bunch of arguments]) 
    end function solve_star 
end module diff_eq 

인자 :

모듈 "diff_eq는"비아 "find_roots"를 호출한다. 예를 들어, "F"에 대한 선언은

function f(r) 
    real(8),intent(in) :: r(:) 
    real(8) :: f(size(r)) 
    integer :: i,n 
    real(8) :: dns(size(r)),prs(size(r)) 

    [bunch of calculations f(n) = ...] 

end function f 

을하고 프로그램 자체는 모든 선언이 포함되어

use diff_eq 
use roots 
use wdstar 

마지막으로, "find_root는"을 통해 이러한 기능을 선언

subroutine find_root(f,df,r,[arguments]) 
    real(8),intent(in out) :: r(n) 
    real(8) :: [more arguments] 
    interface 
     function f(r) 
     real(8),intent(in) :: r(:) 
     real(8) :: f(size(r)) 
     end function f 
     function df(r) 
     real(8),intent(in) :: r(:) 
     real(8) :: df(size(r),size(r)) 
     end function df 
    end interface 

    [bunch o' calcs] 

    end subroutine find_root 

내 질문은 다음과 같습니다. "find_root"에이 함수를 전달하는 적절한 방법은 무엇입니까? 내가 diff_eqf의 선언을 볼 수 없습니다 Symbol "f" has no IMPLICIT type

+1

분명히 왜? 그것이 명백하다면, 왜 여기서 물어 보는거야? ** 완성 된 출력은 무엇입니까? 오류가 발생하면 컴파일러에서 코드 줄을보고합니까? –

+0

@VladimirF 단어의 선택에 대해 사과드립니다. 나는 여기서 물어보기 전에 약간의 독서를했으며, 어떤 것들은 명시 적으로 형식을 정의 할 필요가 있거나 그렇지 않으면 때로는 기본 형식을받을 필요가 있다는 것을 강조한다. 그래서 왜 함수에 할당 할 타입이 있어야하는지 이해하지만, 그것이 무엇인지 이해하지 못합니다. – Yoni

+0

오류의 전체 출력을 의미합니까? 그리고 컴파일러는 "solve_star"함수의 "find_root (f, df, [인수 묶음])"행에 오류를보고합니다. – Yoni

답변

1

: 순간

는 오류가 발생합니다. (있는 경우 표시하십시오.)

f 외부의 경우이를 그대로 선언하십시오. 또는 f이 모듈에있는 경우 적절한 모듈을 사용하십시오.

방금 ​​use wdstar이 누락되었지만 코드의 일부만 표시되므로 잘 모르겠습니다.