2014-06-15 7 views
0

이것은 기본 변환을 수행하는 간단한 프로그램입니다. 당신이 (당신의 절차를 배치하면 내가이 줄Fortran의 함수에서 값을 가져 오는 방법은 무엇입니까?

program echeverria_4 

implicit none 

interface 
    function baseConversion(anumber,abase) 
    character(8) :: baseConversion 
    integer,intent(in) :: anumber, abase 
    end function baseConversion 
end interface 

    integer :: firstNumbers,base,it, numero 
    character(8),dimension(100) :: rangeNumbers 

    !Part A 
    write(*,*) "Project 4 Part A" 
    firstNumbers = 20 
    base = 11 

    write(*,'(i4,i4)') firstNumbers, base 

    do it = 1, firstNumbers 
     write (*,'(i4,a,a)') it," = ",baseConversion(it,base) 
    end do 

end program echeverria_4 


function trans(anumber) 
implicit none 
    character :: trans 
    integer,intent(in):: anumber 

    integer :: conversor1 = 48 
    integer :: conversor2 = 55 
    if (anumber >= 10) then 
     trans = char(anumber+conversor2) 
    else 
     trans = char(anumber+conversor1) 
    endif 
end function trans 


function baseConversion(anumber, abase) 

    implicit none 

    interface 
     function trans(anumber) 
      character :: trans 
      integer,intent(in):: anumber 
     end function trans 
    end interface 

     character(8):: baseConversion 
     integer,intent(in):: anumber,abase 

     character(8) :: leftmost 
     logical :: is_process_complete = .false. 
     integer :: remainder,division,localNumber 

     localNumber = anumber 

     do while(.not. is_process_complete) 
      !Step 1: Find the remainder 
      remainder = mod(localNumber,abase) 
      !Step 2: Divide the number by the base 
      division = localNumber/abase 
      if (division>0) then 
       localNumber = division 
       leftmost=trans(remainder)//leftmost 
      else 
       is_process_complete=.true. 
       leftmost=trans(remainder)//leftmost 
      end if 
     end do 

     write(baseConversion,'(a)') leftmost 
end function baseConversion 

답변

1

그것의 쉬운을 사용하여 값을 얻을 수없는 몇 가지 이유를 들어

write (*,'(i4,a,a)') it," = ",baseConversion(it,base) 

: 나는 루프와 지시어를 사용하여 값을 출력하려고 서브 루틴 및 함수)를 모듈로 변환 한 다음이러한 프로 시저가 필요한 프로그램이나 프로 시저의 모듈을 만듭니다. 그러면 자동으로 인터페이스가 명시 적으로 지정됩니다. 인터페이스를 작성하지 않아도됩니다 ... 작업이 적고 실수가 적습니다. 그래서 :

module MyModule 

contains 


function trans(anumber) 
implicit none 
    character :: trans 
    integer,intent(in):: anumber 

    integer :: conversor1 = 48 
    integer :: conversor2 = 55 
    if (anumber >= 10) then 
     trans = char(anumber+conversor2) 
    else 
     trans = char(anumber+conversor1) 
    endif 
end function trans 


function baseConversion(anumber, abase) 

    implicit none 

     character(8):: baseConversion 
     integer,intent(in):: anumber,abase 

     character(8) :: leftmost 
     logical :: is_process_complete = .false. 
     integer :: remainder,division,localNumber 

     localNumber = anumber 

     do while(.not. is_process_complete) 
      !Step 1: Find the remainder 
      remainder = mod(localNumber,abase) 
      !Step 2: Divide the number by the base 
      division = localNumber/abase 
      if (division>0) then 
       localNumber = division 
       leftmost=trans(remainder)//leftmost 
      else 
       is_process_complete=.true. 
       leftmost=trans(remainder)//leftmost 
      end if 
     end do 

     write(baseConversion,'(a)') leftmost 
end function baseConversion 

end module MyModule 


program echeverria_4 

use MyModule 

implicit none 

    integer :: firstNumbers,base,it, numero 
    character(8),dimension(100) :: rangeNumbers 

    !Part A 
    write(*,*) "Project 4 Part A" 
    firstNumbers = 20 
    base = 11 

    write(*,'(i4,i4)') firstNumbers, base 

    do it = 1, firstNumbers 
     write (*,'(i4,a,a)') it," = ",baseConversion(it,base) 
    end do 

end program echeverria_4 

내가 광범위한 오류/경고 옵션 gfortran와이를 컴파일 할 때, 나는 다음과 같은 경고 메시지를 얻을 : 프로그램 작동하지 않을 수도 있습니다 사람들을 고정

test99.f90:42.51: 

       leftmost=trans(remainder)//leftmost 
                1 
Warning: CHARACTER expression will be truncated in assignment (8/9) at (1) 
test99.f90:45.51: 

       leftmost=trans(remainder)//leftmost 
                1 
Warning: CHARACTER expression will be truncated in assignment (8/9) at (1) 

합니다. 최소한 첫 단계입니다.