2010-06-09 2 views
2

Я могу скомпилировать, но когда я запустил, я получаю эту ошибку «forrtl: strict (40): рекурсивная операция ввода/вывода, единица -1, неизвестный файл», если я устанавливаю n = 29 или более ... Может ли кто-нибудь помочь с тем, где Возможно, я ошибся? Благодарю.Fortran серьезный (40) Ошибка ... Помогите?

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 *,'' 

КОНЕЦ ПРОГРАММЫ РЕШЕНИЕ

+0

+1 Для явной жалости и сочувствия –

ответ

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 
+0

Спасибо за вашу помощь. Я использую intel/fc с ifort для компиляции. Когда вы говорите, что массивы, если n больше 10, находятся вне пределов - где вы можете это видеть? – Taka

+0

@Taka - это одна из ошибок, которую компилятор мне дает, если я скомпилирую ее с помощью n> 10. Я не знаю, какой именно переключатель командной строки для него, но он должен быть где-то под «ifort /?» Помогите. Это также видно из объявлений массивов, которые составляют от 0 до 9, но в цикле DO вы пытаетесь присвоить значения элементам массива, которые идут от 0 до n-2 ..., что st (i + 1) для стартеров ... // Используете ifort из командной строки или из среды IDE? – Rook

+0

ifort/check: bounds Source1.f90 ... часть проверки проверяет наличие ошибок во время работы. – Rook

0

Как @ Idigas идентифицирована, проблема была массивы индексируются мимо их пределы. При разработке программ Fortran полезно: 1) всегда включать все параметры отладки компилятора и, в частности, проверку границ, и 2) помещать ваши подпрограммы и функции в модули и «использовать» их - это позволит компилятору проверить согласованность фактических и фиктивных аргументов. Эти два шага поймут очень большую часть ошибок.

элегантный способ справиться с этой проблемой массив размера в современном Фортране является объявлять массивы распределяемой, а затем установить их размер во время выполнения, после получения пользовательского ввода, а не гадать, максимальный размер, когда вы напишите программу. Если у вас есть причина установить размер во время компиляции, и пользовательский ввод может привести к его превышению, целесообразно проверить этот ввод.

Эскиз частей распределяемого решения:

real, dimension (:), allocatable :: st, stmean 

read (*, *) n 

allocate (st (0:n)) 
allocate (stmean (0:n)) 
Смежные вопросы