함수를 서브 루틴에 대한 인수로 올바르게 전달하는 데 문제가 있습니다.함수`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_eq
에 f
의 선언을 볼 수 없습니다 Symbol "f" has no IMPLICIT type
분명히 왜? 그것이 명백하다면, 왜 여기서 물어 보는거야? ** 완성 된 출력은 무엇입니까? 오류가 발생하면 컴파일러에서 코드 줄을보고합니까? –
@VladimirF 단어의 선택에 대해 사과드립니다. 나는 여기서 물어보기 전에 약간의 독서를했으며, 어떤 것들은 명시 적으로 형식을 정의 할 필요가 있거나 그렇지 않으면 때로는 기본 형식을받을 필요가 있다는 것을 강조한다. 그래서 왜 함수에 할당 할 타입이 있어야하는지 이해하지만, 그것이 무엇인지 이해하지 못합니다. – Yoni
오류의 전체 출력을 의미합니까? 그리고 컴파일러는 "solve_star"함수의 "find_root (f, df, [인수 묶음])"행에 오류를보고합니다. – Yoni