Getting an unclassifiable statement error in Fortran 95

  • Context: Fortran 
  • Thread starter Thread starter ngendler
  • Start date Start date
  • Tags Tags
    Error Fortran
Join the discussion
Registration is free. Ask a follow-up in this thread, or start your own.
4 replies · 29K views
ngendler
Messages
20
Reaction score
0
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!
 
Physics news on Phys.org
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.
 
@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.
 
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
 
'Rename' and 'remove' mean different things, in English at least.