Почему я всегда получаю один и тот же результат при использовании функции и содержит в Фортране - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь выполнить базовое вычисление, вызывая функцию с помощью содержит

Program main
implicit none
integer*8 Nmax,i
Parameter (Nmax=5)
real*8 x, f(Nmax), n

do i=1, Nmax
    n=i
f=func(n,Nmax)
    write(*,*) f(i)
end do 

Contains
   real*8 function func(x,Nmax)
   integer*8 Nmax,i
   real*8 x, f(Nmax)

    do i=1, Nmax-1
        f(i)=i**2d0-4d0*i-7d0
    end do
   end function
end program main

 I get this result:
 -9.255963134931783E+061
 -9.255963134931783E+061
 -9.255963134931783E+061
 -9.255963134931783E+061
 -9.255963134931783E+061

Я думаю, что я делаю неправильные определения переменных. Спасибо за вашу помощь.

1 Ответ

4 голосов
/ 16 июня 2019

Есть несколько проблем с вашей программой.

Во-первых, вы, вероятно, хотели написать:

f(i)=func(n,Nmax)

в основной программе.Без индекса вы присваиваете одно и то же значение каждому элементу массива.Вы можете подумать, что это объясняет результаты, но это не так, поскольку вы все равно видите, что ожидаете.

Другая проблема высвечивается следующим предупреждением, которое я получаю, когда компилирую ваш код с Intel Fortran:

t.f90(14): warning #6178: The return value of this FUNCTION has not been defined. [FUNC] real*8 function func(x,Nmax) -------------------^

Вы никогда не присваиваете значение func, поэтому вы получаете все, что происходит с мусором в регистре возврата.

Ваша функция не совсем то, что выхочу тоже.Вам, вероятно, нужен тот, который вычисляет и возвращает скалярное (одиночное) значение, и, следовательно, нет необходимости в массиве внутри func.

Третья проблема заключается в том, что func игнорирует аргумент n (который, в отличие от соглашения,вы объявили как реальное.)

Если вы хотите, чтобы в основной программе был цикл, сделайте так, чтобы функция вычислялась и возвращала единственный результат на основе переданного ей аргумента.Нет необходимости каждый раз передавать и индекс цикла, и nmax.Другие варианты, немного более продвинутые, заключаются в том, чтобы сохранить присваивание массива в основной программе, но покончить с циклом и заставить функцию вернуть массив или сделать функцию ELEMENTAL.Я оставлю это как упражнение для вас, как только вы поймете, что вы действительно намерены здесь.

Наконец, я бы не рекомендовал вам использовать нестандартный синтаксис, такой как "real * 8".Пожалуйста, ознакомьтесь со спецификаторами KIND и встроенной функцией SELECTED_REAL_KIND.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...