Предупреждение объявления функции: возвращаемое значение функции 'f' в (1) не установлено [-Wreturn-type] - PullRequest
1 голос
/ 26 мая 2020

Мой код компилируется, но с ошибкой:

Warning: Return value of function ‘f’ at (1) not set [-Wreturn-type].

Я использую geany. Ниже мой код.

        program ROVNICANEWTON

        implicit none

        integer k
        double precision x0, f, df

        k=0
        x0=2d0

        if (abs(f(x0)) .lt. (0.0000000001)) then
         go to 20
        else
         k=k+1
         x0=x0-f(x0)/df(x0)
         print *, k 
        end if

20     continue    

    open(30, file='NEWTON.txt', status='unknown')
        write(30,*) 'x = ', x0  
    close(30)    
        END PROGRAM

        double precision function f(x)
        implicit none
        double precision, intent(in) :: x

        f(x)=(x**(x**2))-1000

        return
        end function f

        double precision function df(x)
        implicit none
        double precision, intent(in) :: x

        df(x)=2*x**(2+x**2)

        return
        end function df 

1 Ответ

2 голосов
/ 26 мая 2020

Сообщение об ошибке в этом случае, я думаю, сбивает вас с пути. Он предполагает, что вы не создаете возвращаемое значение для функции, хотя на самом деле строка, в которой вы пытаетесь сделать именно это, синтаксически неверна.

Помните, что всякий раз, когда функция выполняется, x будет иметь заданное значение c, и поэтому должно возвращаемое значение f:

double precision function f(x)
    implicit none
    double precision, intent(in) :: x
    f = (x**(x**2)) - 1000
end function f

Аналогично, вам нужно удалить (x) из строки df(x)=2*x**(2+x**2)

Я также Мне не нравится, что вы используете goto в этом случае. Много раз, когда вы думаете об использовании goto, есть лучший, менее прерывающий способ.

Это потому, что goto прерывает поток исходного кода. Это усложняет отслеживание.

В этом случае вам нужно делать это, пока не будет выполнено условие . Есть два способа упростить чтение:

do
    if (abs(f(x0)) < 1d-10) exit
    k = k + 1
    x0 = x0 - f(x0)/df(x0)
    print *, k
end do

Или, что еще точнее, c:

do while (abs(f(x0)) >= 1d-10)
    k = k + 1
    x0 = x0 - f(x0)/df(x0)
    print *, k
end do
...