Getting an unclassifiable statement error in Fortran 95

  1. Getting an "unclassifiable statement" error in Fortran 95

    I am trying to integrate the function x from 0 to 1. Here is my code:

    program myownmonte
    !This program will integrate the function x from 0 to 1
    implicit none
    real :: ans0,y,f,x,xmax
    integer :: icount,nmax,i,iseed
    iseed = 89237
    call srand(iseed)

    nmax = 100000

    icount = 0
    xmax = 1
    ans0 = 0
    do i=1,nmax
    x = rand()
    y = rand()
    f = f(x)
    if (y.le.f) then
    icount = icount + 1
    end if
    ans0 = ans0 + f(x)
    end do
    print *, icount/nmax,ans0/nmax
    end program myownmonte



    function f(x)
    implicit none
    real :: x,f
    f = x
    end function f


    And here are the errors I'm getting:

    f = f(x)
    1
    Error: Unclassifiable statement at (1)
    mymonte.f95:21:

    ans0 = ans0 + f(x)
    1
    Error: Unclassifiable statement at (1)


    Could someone help me fix this, and kindly let me know what the phrase "unclassifiable statement" means? Thanks in advance!
     
  2. jcsd
  3. SteamKing

    SteamKing 9,397
    Staff Emeritus
    Science Advisor
    Homework Helper

    In your main program, you have a variable 'f' and also a function 'f'. You can't have both in the same program unit. Rename either the variable or the function.
     
  4. @SteamKing, that didn't work. When I remove f from my list of reals, I get another error saying that f has no implicit type, which makes me think that I need it to be declared as real.
     
  5. SteamKing is still right that using f as both a function and a variable is the problem. The statement:

    f = f(x)

    really makes no sense, since you are trying to use the same symbol as a variable and a function. Your attempt to fix it wasn't correct, since you need to tell the compiler what kind of datatype f is. You need to do something like this. This will compile and run.


    program myownmonte
    !This program will integrate the function x from 0 to 1
    implicit none
    real :: ans0,y,f,fx,x,xmax
    integer :: icount,nmax,i,iseed
    iseed = 89237
    call srand(iseed)

    nmax = 100000

    icount = 0
    xmax = 1
    ans0 = 0
    do i=1,nmax
    x = rand()
    y = rand()
    fx = f(x)
    if (y.le.fx) then
    icount = icount + 1
    end if
    ans0 = ans0 + fx
    end do
    print *, icount/nmax,ans0/nmax
    end program myownmonte



    function f(x)
    implicit none
    real :: x,f
    f = x
    end function f
     
  6. SteamKing

    SteamKing 9,397
    Staff Emeritus
    Science Advisor
    Homework Helper

    'Rename' and 'remove' mean different things, in English at least.
     
Know someone interested in this topic? Share a link to this question via email, Google+, Twitter, or Facebook

Have something to add?

0
Draft saved Draft deleted