Reputation: 10650
So i have a program, which has something like this in it:
integer :: mgvn, stot, gutot, iprint, iwrit, ifail, iprnt
...
call readbh(lubnd,nbset,nchan,mgvn,stot,gutot,nstat,nbound,rr,bform,iprnt,iwrit,ifail)
And then inside readbh
:
CALL GETSET(LUBND,NSET,KEYBC,BFORM,IFAIL)
IF(IFAIL.NE.0) GO TO 99
...
99 WRITE(IWRITE,98) NBSET,LUBND
IFAIL = 1
RETURN
Where all the other variables are defined, but ifail
is not. If i add in write(*,*) ifail
before the function call, i get the undefined variable error, but if i leave it out, it doesn't complain, and just runs away with the function, and always fails, with IFAIL=1
.
Is this because it's just getting to the end of the arguments in the readbh
function, reading in uninitialised memory - which is just random jibberish - and then casting those bits to an int
- which is not going to be zero unless i'm very (un)lucky, and so nearly always making ifail.ne.0
true
?
Upvotes: 1
Views: 1442
Reputation: 78316
I'll choose to interpret what you call undefined variable as uninitialised variable. Generally speaking Fortran, and many other compiled programming languages, will quite happily carry on computing with uninitialised variables. It/they are programming languages for grown-ups, it's on our own head if you program this sort of behaviour. It is not syntactically incorrect to write a Fortran program which uses uninitialised variables so a compiler is not bound by the language standard to raise a warning or error.
Fortran does, though, have the facility for you to program functions and subroutines to ensure that output arguments are given values. If you use the intent(out)
attribute on arguments which ought to have values assigned to them inside a procedure, then the compiler will check that an assignment is made and raise an error if one is not.
Most compilers have an option to implement run-time checking for use of uninitialised variables. Intel Fortran, for example, has the flag -check:uninit
. Without this check, yes, your program will interpret whatever pattern of bits it finds in the region of memory labelled ifail
as an integer and carry on.
You write that your function always fails with ifail == 1
. From what you've shown us ifail
is, just prior to the return
at (presumably) the end of the call to readbh
, unconditionally set to 1
.
From what you've revealed of your code it looks to me as if ifail
is intended as an error return code from getset
so it's not necessarily wrong that it is uninitialised on entry to that subroutine. But it is a little puzzling that readbh
then sets it to 1
before returning.
Upvotes: 1