0

これは基数変換を実行する単純なプログラムです。ループとディレクティブを使用して値を出力しようとしました:

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

何らかの理由で、この行を使用して値を取得できません

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
4

1 に答える 1

1

手順 (サブルーチンと関数) をモジュールに配置してからuse、それらの手順を必要とするプログラムまたは手順のモジュールを配置すると、より簡単になります。これにより、自動的にインターフェイスが明示的になります。インターフェースを書く必要はありません...作業が減り、ミスの可能性が減ります。そう:

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)

それらを修正すると、プログラムが機能する可能性があります。それは少なくとも最初のステップです。

于 2014-06-16T06:49:08.513 に答える