2014-09-19 4 views
1

다소 이해하기 어려운 Fortran 코드가 있습니다.
1. 코드 / (i1,i1=0,nn-1) /의 구조 이름은 무엇입니까?
콘텐츠를보기 위해 코드에서 직접 인쇄하려면 어떻게해야합니까?
2. 다시 컴파일하지 않고 nn의 값을 변경하는 방법을 찾고 있는데 어떻게해야합니까? nn은 배열 길이가 omega 인 것으로 가정합니다.
3. nn을 변경할 수있는 경우 omega 길이를 어떻게 설정해야합니까? 나는 더 이상 parameter (nn=20)가 없을 때를 의미합니다.Fortran 코드에 대한 몇 가지 질문입니다. Fortran에 익숙하지 않습니다.

program test_20140919 
    ! test 
    implicit none 
    integer nn 
    parameter (nn=20) 
    real omega(nn) 

    call test_real(nn, 2.0, 4.0, omega) 

    print *, omega 
    end program test_20140919 

    !c === 

    subroutine test_real(nn, o1, o2, omega)  
    integer nn 
    real o1, o2 
    real omega(nn) 

    print *, nn 
    omega = o1 + (o2*o1)*(/ (i1,i1=0,nn-1) /)/real(nn-1) 
    print *, real(nn) 
    return 
    end 

이 내용은 터미널에 gfortran test.f -ffree-form -o test 행으로 컴파일되었습니다.

UPD 인해 블라디미르 F로부터 응답에 대한 부호의 개정판 :

 module subs 

     implicit none 

     contains 

     subroutine test_real(nn, o1, o2, omega)  
      integer nn 
      real o1, o2 
      real :: omega(:) 

      if (.not. allocated(omega)) allocate(omega(nn)) 
      omega = o1 + (o2*o1)*(/ (i1,i1=0,nn-1) /)/real(nn-1) 
      print *, real(nn) 

     end subrotine 

     end module 

     program test_20140920 
     ! test 

     use subs 

     implicit none 

     integer nn 
     real, allocatable :: omega(:) 

     read(*,*) nn 

     allocate(omega(nn)) 

     call test_real(nn, 2.0, 4.0, omega) 

     print *, omega 
     end program test_20140920 
+1

명령 줄 입력 리디렉션 ('>')을 사용하여 텍스트 파일을 표준 입력으로 리디렉션 할 수도 있습니다. 그러면 프로그램에서 파일을 읽습니다. –

답변

3

1)이 (/ ... /) 인 배열 생성자이다.

(i1,i1=0,nn-1)은 함축 된 루프입니다.

2) 읽기 문

 integer :: nn 

    read(*,*) nn 

3) 나는 포트란 튜토리얼이나 포트란 책을 읽고 이러한 개념을 숙지 할 것을 권장 할당 가능한 배열

real, allocatable :: omega(:) 

... 

allocate(omega(nn)) 

을 사용을 사용하여 읽기 .

+0

2) 입력에서 간단한 읽기가 아닌 명령 줄 매개 변수 사용이 예상됩니다. 3) 괜찮습니다.하지만이 경우 서브 루션 인터페이스를 코드에 추가해야합니다. – aestet

+0

예상되었지만 지정하지 않았습니다. 컴파일러의 매뉴얼에서'get_command_argument()'를 찾는다. 3) 인터페이스 블록이 필요 없거나 바람직하지 않으며, 모듈을 배우십시오. 서브 루틴 안에서는 가정 된 모양 배열'omega (:)'을 사용하십시오. 서브 루틴에서 할당 할 필요가 없습니다. –

+0

모듈을 사용하는 것이 인터페이스를 사용하는 것보다 더 선호되는 이유를 설명해 주시겠습니까? 필자가 생각한 첫 번째 아이디어는 주 프로그램과 보조 서브 루틴을 여러 파일로 분리하는 것이 더 쉽다는 것입니다. – aestet

관련 문제