一些背景.我有这段代码:
function areeq(array1,array2) result(eq)
real :: array1(1:100,1:100), array2(1:100,1:100)
logical :: eq
integer :: x,y,f
do x=1,100
do y = 1,100
print *,array1(x:x,y:y)
print *,array2(x:x,y:y)
if(.not.(array1(x:x,y:y) == array2(x:x,y:y))) then
eq = .false.
return
end if
read *,f
end do
end do
eq = .true.
return
end function
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行它时,它会抛出此错误消息:
if(.not.(array1(x:x,y:y) == array2(x:x,y:y))) then
1
Error: IF clause at (1) requires a scalar LOGICAL expression
Run Code Online (Sandbox Code Playgroud)
这是我第二次遇到需要Scalar的问题,尽管我最后一次成功地进行了临时工作,但我真的应该并且需要能够正确处理它们.
所以,TL; DR:这段代码出了什么问题,在这种情况下我应该怎样做呢?
具体来说,我试图模拟Fortran中Project Euler 31的解决方案.为了做到这一点,我需要从一系列硬币中读取.由于函数是递归的,因为函数将被调用次数,我不希望每次都必须将列表作为参数传递,因为如果我有大量的列表副本,代码就会有负载内存开销 此外,在以前的问题中,比如简化分数的函数,我需要通过一个非常大的列表.所以我的问题是:在Fortran中,如何从函数中访问主程序中定义的变量.它是否可以实现,如果没有,有多少意图(帮助)减轻任何内存重复?
如有必要:
RECURSIVE FUNCTION NWAYS(AMOUNT,CUR_COIN,) RESULT(RES)
IMPLICIT NONE
INTEGER :: AMOUNT, CUR_COIN, RES, COINS !Coins is a list defined in the main program
RES = 0
IF (CUR_COIN<=1) THEN
RES = 1
RETURN
END IF
DO WHILE(AMOUNT>=0)
RES = RES + NWAYS(AMOUNT,CUR_COIN-1)
AMOUNT = AMOUNT-COINS(CUR_COIN)
END DO
RETURN
END FUNCTION NWAYS
Run Code Online (Sandbox Code Playgroud) program PEU3
integer(kind=7) :: num = 600851475143
integer(kind=7) :: pf, counter
Run Code Online (Sandbox Code Playgroud)
这是我的fortran代码的一部分.Num非常大,所以我试图将它设置为kind = 7,但由于某种原因它仍然抛出错误217 - 整数(Kind = 3)常量超出范围,对于声明num的行,即使我已经声明了num应该是善良的7.我已经有一段时间了,并且无法理解为什么它不会起作用.非常感谢帮助.我的IDE是柏拉图,带有silverfrost编译器,如果它是相关的.