2014-06-10 4 views
2

Fortran을 처음 사용하지만 필자가 작성한 프로그램에서 새 파일에 서브 프로그램으로 포함시키지 않고 정보를 검색 할 수있는 방법을 찾으려고합니다. 현재로서는 새 파일 내에 4 개의 서브 루틴이 있으며 대신 모든 4에 반경을 입력하고 해당 출력을받을 수 있기를 원합니다.여러 파일을 fortran으로 연결

이것은 내 코드의 기본 형식입니다. 기본적으로 현재 프로그램 표현에 필요한 모든 변수를 얻으려면 4 개의 개별 프로그램이 필요합니다. 지금까지 include 및 call 표현식을 모두 사용해 보았지만 파일로 되돌리려면 필요한 정보를 검색 할 수 없었으며 "적용되지 않는"답변이있었습니다.

program practicedynamo 

    implicit none 

    real:: A,B,C, Radius 

    real::Bsquared,Vsquared 

    read*,radius 

    call programA(radius,A) 

    call programB(radius,B) 

    call programC(radius,C) 


    Vsquared=(1.0/3.0)*B 

    Bsquared= 4*pi*density*Vsquared 

    gradient=radius*C 

    Rvector=Bsquared*Vsquared*gradient 

    ThetaVector=Rvector*sin(A) 

end program practicedynamo 

!and then my four subroutines would be placed afterwards 
!here is an example of one of my subroutines within my actual code (the version above has been simplified and I've changed the variables) 

subroutine testdensity(radius,density) 

implicit none 

    real::radius,x,sunradius,density 

    if (radius>0.and.radius<=695500000) then 

     sunradius=695500000 

     x=radius/sunradius 

     density=((519*x**4.0)-(1630*x**3.0)+(1844*x*x)-(889*x)+155) 

     print*,"            " 

     density=density*1000 

     print*,"the density is",density, "kg per meters cubed" 

    else 

     print*, "this radius is not an option for the sun" 

    end if 

end subroutine testdensity 
+1

반지름을 서브 루틴 인수로 전달합니다. 괜찮습니다. programA와 같은 서브 루틴 중 하나에 대한 코드와 프로그램의 출력이 포함되어야합니다. 이전에 서브 루틴을 사용해 보셨습니까? 온라인 튜토리얼에서 서브 루틴이 사용되는 방법의 예를 찾으십시오. – Fortranner

+0

내 서브 루틴은 잘 작동합니다. 서브 루틴으로 할 때 원하는 모든 것을 제공하기 위해 노력하고있는 코드를 얻을 수 있습니다. 나는 그들 중 엄청난 양의 것을 가지고있을 때 항해하기가 어려워 질 것이고, 나는 문제를 겪을 것이라고 걱정한다. 서브 루틴을 사용하는 것이 이런 종류의 일을하는 가장 좋은 방법이라면 나는 그것을 계속 할 것입니다. 나는 물건을 더 분명하게하기 위해 나의 서브 루틴 중 하나를 포함 할 것이다. – user3617451

답변

4

코드를 컴파일하는 방법에 대해서는 언급하지 않았지만 하나의 실행 파일에 여러 소스 파일을 포함시키는 일반적인 방법이 있습니다. 파일을 포함 할 필요가 없습니다. 파일을 따로 컴파일하고 함께 연결할 수 있습니다. 이렇게하기위한 Makefile을 작성하는 것이 좋으며, 다른 곳에서 많은 예제를 찾을 수 있습니다.

gfortran -o output programA.f90 programB.f90 programC.90 mainprogram.f90 

를 컴파일 할 때 당신이 빌드 할 때 다시 컴파일 모두 함께 컴파일하거나하고 싶지 않을 경우

당신은 개별 개체를 컴파일 할 수 있습니다, 당신이 그들 모두를 나열하기 만하면, 하나의 실행 파일로 여러 파일을 컴파일하려면 , 예. 다음

gfortran -c -o programA.o programA.f90 
gfortran -c -o programB.o programB.f90 
gfortran -c -o programC.o programC.f90 

하고는,

대신 라이브러리를 사용하려는 경우

gfortran -o output mainprogram.f90 programA.o programB.o programC.o 

로 연결하고 AC 독립형 라이브러리에하는 프로그램이 처음으로 위의 객체를 컴파일 할 수 있습니다 원하는

ar rcs libABC.a programA.o programB.o programC.o 

한 다음

gfortran -o output mainprogram.f90 libABC.a 
012로 메인 프로그램을 컴파일

모듈을 사용하지 않는 경우 외부 서브 루틴 호출이 외부 파일의 선언 된 인터페이스와 일치하는지 확인해야합니다. 안전하고 컴파일러가 일치하지 않는 인수로 문제를 잡으려면 프로그램에서 명시 적 인터페이스를 선언하거나 외부 코드를 모듈에 넣고 주 프로그램의 해당 모듈 use을 넣을 수 있습니다.

+0

감사합니다. 나는 정말 들여다보아야 할 방향이 필요했습니다. 나는 메이크 파일을 연구 할 것이고, 그들은 내가 필요한 것처럼 들린다. – user3617451