我可以编译但是当我运行时我得到这个错误“forrtl:severe(40):递归I / O操作,单位-1,文件未知”如果我设置n = 29或更多...任何人都可以帮助哪里可能出错?感谢。
PROGRAM SOLUTION
IMPLICIT NONE
! Variable Declaration
INTEGER :: i
REAL :: dt
DOUBLE PRECISION :: st(0:9)
DOUBLE PRECISION :: stmean(0:9)
DOUBLE PRECISION :: first_argument
DOUBLE PRECISION :: second_argument
DOUBLE PRECISION :: lci, uci, mean
REAL :: exp1, n
REAL :: r, segma
! Get inputs
WRITE(*,*) 'Please enter number of trials: '
READ(*,*) n
WRITE(*,*)
dt=1.0
segma=0.2
r=0.1
! For n Trials
st(0)=35.0
stmean(0)=35.0
mean = stmean(0)
PRINT *, 'For ', n ,' Trials'
PRINT *,' 1 ',st(0)
! Calculate results
DO i=0, n-2
first_argument = r-(1/2*(segma*segma))*dt
exp1 = -(1/2)*(i*i)
second_argument = segma*sqrt(dt)*((1/sqrt(2*3.1416))*exp(exp1))
st(i+1) = st(i) * exp(first_argument+second_argument)
IF(st(i+1)<=20) THEN
stmean(i+1) = 0.0
st(i+1) = st(i)
else
stmean(i+1) = st(i+1)
ENDIF
PRINT *,i+2,' ',stmean(i+1)
mean = mean+stmean(i+1)
END DO
! Output results
uci = mean+(1.96*(segma/sqrt(n)))
lci = mean-(1.96*(segma/sqrt(n)))
PRINT *,'95% Confidence Interval for ', n, ' trials is between ', lci, ' and ', uci
PRINT *,''
END PROGRAM SOLUTION
答案 0 :(得分:1)
我承认,我没有花时间试图理解程序的功能,但在“快速”编译的基础上,可以看到一些错误:
- 首先,我无法重现你的错误 - 非常期待,因为我没有看到你在哪里将任何单位分配给文件。您是否介意仔细检查这是否确实是您遇到的错误并说明编译器是什么?
- 如果n大于10的数组超出范围
- 第二次写的是什么,只是abov“dt”试图写出来?
- 为什么需要双精度?
- 另外,如果你在循环中使用“n”作为索引,那么将它声明为整数而不是实数是明智的
- 你使用“n”作为索引,但也使用平方根...在使用FLOAT(n)函数的平方根中将其转换为实数值
除此之外(也许还有其他一些让我不知所措的事情),我认为它并没有错。对于n <= 10,它给出结果。虽然我再说一遍,但我还没有花时间去分析它们,所以它们可能不正确,但它确实给了它们。
program solution; implicit none
!variable declaration
integer :: i, n
real :: dt, first_argument, second_argument, lci, uci, mean, exp1, r, segma
real, dimension(0:99) :: st, stmean
WRITE(*,'("Please enter number of trials: ",\)'); read(*,*)n
dt=1.0; segma=0.2; r=0.1
st(0)=35.0; stmean(0)=35.0; mean=stmean(0)
write(*,'("For ",i2.2," trials")')n
write(*,'(" 1 ",f14.5)')st(0)
DO i=0, n-2
first_argument = r-(1/2*(segma*segma))*dt
exp1 = -(1/2)*(i*i)
second_argument = segma*sqrt(dt)*((1/sqrt(2*3.1416))*exp(exp1))
st(i+1) = st(i) * exp(first_argument+second_argument)
IF(st(i+1)<=20) THEN
stmean(i+1) = 0.0
st(i+1) = st(i)
else
stmean(i+1) = st(i+1)
ENDIF
PRINT *,i+2,' ',stmean(i+1)
mean = mean+stmean(i+1)
END DO
uci = mean+(1.96*(segma/sqrt(float(n))))
lci = mean-(1.96*(segma/sqrt(float(n))))
PRINT *,'95% Confidence Interval for ', n, ' trials is between ', lci, ' and ', uci
END PROGRAM SOLUTION
答案 1 :(得分:0)
正如@Idigas所确定的,一个问题是数组被索引超过它们的界限。在开发Fortran程序时,1)总是打开所有编译器调试选项,特别是边界检查,以及2)将子程序和函数放入模块并“使用”它们是有用的 - 这将允许编译器检查一致性实际和虚假的论点。这两个步骤将捕获很大一部分错误。
在现代Fortran中处理数组大小问题的优雅方法是将数组声明为 allocatable ,然后在接收到用户输入后在运行时设置它们的大小,而不是猜测编写程序时的最大大小。如果您有一些理由在编译时设置大小,并且用户输入可能导致超出它,那么测试该输入是明智的。
可分配解决方案的部分草图:
real, dimension (:), allocatable :: st, stmean
read (*, *) n
allocate (st (0:n))
allocate (stmean (0:n))