Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Really Strange, Evil MacFortran Problem

3 views
Skip to first unread message

Wiley Sanders

unread,
Nov 6, 1986, 7:46:32 PM11/6/86
to

Here is a really perplexing bug in MacFortran 2.2. I was trying to write
a simple program to calculate values of a poisson distribution, and dis-
covered that, in passing values to an external function, the values were
being trashed during the call to the external function, *regardless of
whether the parameters were touched (equated) in the function*. I was
trying to get the following program to work:

C This program does not work
C remove or comment out line 6 (the if/execute stmt) and it will work
program tst
real la
integer j,m
do 20 m=1,4
la=480./3600.
j=24
if (m.EQ.-1) execute 'v2:MacFortran 2.2'
write (9,fmt='(a,f14.2,2i20)') 'Bef Passing:',la,j,m
write (9,fmt='(a,f14.2)') 'Val of bugger:',bugger(la,j,m)
20 write (9,fmt='(a,f14.2,2i20)') 'Aft Passing:',la,j,m
pause
execute 'v2:macFortran 2.2'
end

real function bugger(lambda,i,m)
C just passes the factorial of the third parameter
real lambda
integer i,m
write (9,100) 'bugger:',lambda,i,m
100 format(a,f14.2,3x,2i20)
bugger=real(ifact(m))
return
end

integer function ifact(i)
C Compute Factorial
C Param - i Returns - i!
integer i,k
ifact=1
IF (i.EQ.0) return
do 5 k=1,i
5 ifact=ifact*k
return
end

The values of la,j, and m in the main program were always trashed upon
returning from the function - but for the first time only! In addition
I noted that, even though m was trashed, usually to some large integer,
the program still counted the do loop correctly and called
the function 4 times. After two days worth of messing around, changing
random stuff here and there, lo and behold, upon removing line
6 (the if/execute line, a spurious line left over from a previous version
of the program that didn't work either, but accepted keyboard input and
was supposed to exit upon detecting an input value of -1), the following
program was created. It runs fine and the values are not trashed!

C This program works ok
C comment out line 6 (the if/execute stmt) and it will work
program tst
real la
integer j,m
do 20 m=1,4
la=480./3600.
j=24
C if (m.EQ.-1) execute 'v2:MacFortran 2.2'
write (9,fmt='(a,f14.2,2i20)') 'Bef Passing:',la,j,m
write (9,fmt='(a,f14.2)') 'Val of bugger:',bugger(la,j,m)
20 write (9,fmt='(a,f14.2,2i20)') 'Aft Passing:',la,j,m
pause
execute 'v2:MacFortran 2.2'
end

real function bugger(lambda,i,m)
(EXACTLY the same as above)
return
end

integer function ifact(i)
(EXACTLY the same as above)
return
end

I know that MacFortran is extraordinarily sensitive to nulls and other
spurious characters that sometimes end up in a source file, but I looked
at the first file with FEdit and there are none -the file is clean.
What gives? Is MacFortran incapable of handling external functions?
Anybody else have this problem? Someone should try clipping the first
listing above and see is it works - maybe there is something wrong with
my particular copy or something.
Meanwhile, I will valiantly try to find a workaround, But it's kind of
like trying to find a workwround when you add 2+2 and get 5.

%*!&^&#*!

-Wiley Sanders
wma...@ngp.UTEXAS.EDU

0 new messages