首页 > 解决方案 > 错误:DUMMY 属性与 RESULT 属性冲突

问题描述

我有一个按以下方式格式化的 Fortran 90 程序

program main
<bulk of code that uses update_board>
end program main

integer function update_board(board, tochange, N) result(tochange)
    integer, dimension(:, :) :: board, tochange
    integer N
    
    do i=2,N+1
        do j=2,(N+2)/2
            nna = board(i+1, j+1) + board(i, j+1) + board(i-1, j+1) &
            + board(i-1, j) + board(i-1, j-1) + board(i, j-1) &
            + board(i+1, j-1) + board(i+1,j)
            
            if (nna .eq. 3) then
                tochange(i, j) = 1
            else if (nna .eq. 2) then
                tochange(i, j) = board(i, j) 
            else
                tochange(i, j) = 0
            end if
        end do
    end do
end function update_board

但是,当我运行代码时,我得到了编译错误

integer function update_board(board, tochange, N) result(tochange)
                                                                  1
Error: DUMMY attribute conflicts with RESULT attribute in 'tochange' at (1)
parallel_game_of_life.f90:1.12:

program main
            1
parallel_game_of_life.f90:144.47:

    integer, dimension(:, :) :: board, tochange
                                               2
Error: Two main PROGRAMs at (1) and (2)

我确信后一个two main PROGRAMs错误是第一个错误的直接结果。但是,我很困在这里。我想更新一个输入变量并将其用作结果,因为我无法声明像integer, dimension(:, :) function ...

标签: debuggingfortrangfortran

解决方案


您在代码中错误地声明了函数输出。您已经两次声明了输出类型,但也将其作为输入和输出。如果您想将其作为输入,请使用subroutine而不是function. 这是根据我的理解对您的代码进行的修复,

function update_board(board, n) result(tochange)
    integer, intent(in) :: n
    integer, intent(in) :: board(n,(n+2)/2+1)
    integer             :: tochange(n,(n+2)/2+1)
    
    do i=2,N+1
        do j=2,(N+2)/2
            nna = board(i+1, j+1) + board(i, j+1) + board(i-1, j+1) &
            + board(i-1, j) + board(i-1, j-1) + board(i, j-1) &
            + board(i+1, j-1) + board(i+1,j)
            
            if (nna .eq. 3) then
                tochange(i, j) = 1
            else if (nna .eq. 2) then
                tochange(i, j) = board(i, j) 
            else
                tochange(i, j) = 0
            end if
        end do
    end do
end function update_board

等效的subroutine实现如下,

subroutine update_board(n, board, tochange)
    integer, intent(in)  :: n
    integer, intent(in)  :: board(n,(n+2)/2+1)
    integer, intent(out) :: tochange(n,(n+2)/2+1)
    
    do i=2,N+1
        do j=2,(N+2)/2
            nna = board(i+1, j+1) + board(i, j+1) + board(i-1, j+1) &
            + board(i-1, j) + board(i-1, j-1) + board(i, j-1) &
            + board(i+1, j-1) + board(i+1,j)
            
            if (nna .eq. 3) then
                tochange(i, j) = 1
            else if (nna .eq. 2) then
                tochange(i, j) = board(i, j) 
            else
                tochange(i, j) = 0
            end if
        end do
    end do
end function update_board

然后,call subroutine(n, board, tochange)而不是tochange = function(board, n).


推荐阅读