fortran - 如何在while循环中更改fortran程序索引变量?
问题描述
我有以下代码:
PROGRAM PEU72
USE PRIMES
IMPLICIT NONE
INTEGER, PARAMETER :: MYKIND = SELECTED_INT_KIND(16)
INTEGER (KIND=MYKIND) :: SOFAR
INTEGER :: NRP, M
SOFAR = 0_MYKIND
CALL GEN(ALLNUMS,ALLPRIMES) ! This is a call to a module that creates a list of primes. It works fine.
DO M = 2,8 ! When I try to compile in G95, this loop doesn't increment. M = 2 for each cycle.
SOFAR = SOFAR + NRP(M)
END DO
PRINT *,'ANS: ',SOFAR
READ *,SOFAR
END PROGRAM PEU72
FUNCTION NRP(NUM) RESULT(PHI)
USE PRIMES
IMPLICIT NONE
INTEGER :: NUM, PHI, I!, DIF
INTEGER :: VAR
I = 1
PHI = NUM-1
VAR = NUM
DO
IF (MOD(NUM,ALLPRIMES(I))==0) THEN
PHI = PHI-((NUM-1)/ALLPRIMES(I))
NUM = NUM/ALLPRIMES(I) ! This is the line that silverfrost doesn't like. The code works absolutely fine without it, it just takes too long.
END IF
I = I + 1
VAR = NUM-ALLPRIMES(I)
IF (VAR<0) THEN
EXIT
END IF
END DO
RETURN
END FUNCTION
出于优化目的,我想在每次迭代中除以 num(while 循环的标准)。当我这样做时,我的(silverfrost)编译器抛出一个错误(Active DO loop changed),并且 G95 编译器完全中断,根本没有迭代第一个循环。我试过使用 DO - IF - EXIT 术语,但都不起作用。如何实现 Num 每次都被划分,并且 Allprimes(i) 递增的情况?
解决方案
在行
NUM = NUM/ALLPRIMES(I)
您正在更改作为参数NUM
输入的内容。实际上你正在改变它NRP
的调用。NRP
M
M
Fortran 默认通过引用传递参数。(并且通过@francescalus 评论的空中碰撞:“试图修改循环内的循环变量 m (作为与 num 关联的实际参数)。这是不允许的。”)。
因此,您必须根据问题更改您的 for 循环或NUM
在您的例程中重新定义。
推荐阅读
- vue.js - 通过插槽 Vue 3 访问 Vue 组件
- javascript - 如何在 NextJS 应用程序中使用 SWR 呈现来自 GraphQL 的 Apollo Server 实例的数据?
- ios - React Native Detox - 本地和 CI 有不同的结果
- c# - 打字稿 下载 PDF 文件
- .net - 使用 GitHub Actions 在 .net 应用程序中填充特定于环境的变量
- python - Errno 22 文件路径的参数无效
- sql - Redshift - 断言代码:SELECT column1 FROM my.view 上的 1000,但不在 SELECT * FROM my.view 上
- c - 如果它们的数量由输入而不是由变量确定,我如何加载然后打印多个数字
- python - 从字符串变量创建列表
- python - 如何根据analyze_recording()的“分析”中包含的信息在psynet中试用后显示自定义反馈?