debugging - 错误: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 ...
解决方案
您在代码中错误地声明了函数输出。您已经两次声明了输出类型,但也将其作为输入和输出。如果您想将其作为输入,请使用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)
.
推荐阅读
- reactjs - 单击登录按钮时,页面正在重定向但不呈现页面
- java - com.mysql.jdbc.MysqlDataTruncation:数据截断:日期值不正确
- css - 如何更改 Vuetify v-overflow-btn 的底部边框颜色?
- rest - 通过 rest/V1/configurable-products/(sku)/children 获取子产品
- apache-kafka - kafka 无法启动,因为集群/id 已从 Zookeeper 中删除
- grails - 如何在 grails 3.xx 中禁用密码编码
- sql-server - 没有行号的序列
- c++ - 如何获取枚举项的类型?
- angular - url绑定的角度vg-player源问题
- excel - 使用 Excel VBA 使用 getElementById 搜索网站