smd@umcp-cs.UUCP (Stanley Dunn) (11/19/85)
Replace this line with your compiler bug I sat down to write the program for the next project I am going to give to my Computer Science I class at home on my CPM system with Turbo Pascal Version 3.00. The following program illustrates the problem with the program I wrote: program junk(input,output); procedure proca(chita:char); forward; procedure procb(chitb:char); begin writeln('Entering procb with a ',chitb); proca('A'); writeln('Leaving procb with a ',chitb); end; procedure proca; begin writeln('Entering proca with a ',chita); if chita = 'I' then procb('I'); writeln('Leaving proca with a ',chita); end; begin proca('I'); end. The output using Turbo Pascal was: Entering proca with a I Entering procb with a I Entering proca with a A Leaving proca with a A Leaving procb with a I Leaving proca with a A While the output for the same program on a VAX with BSD UNIX, IBM VM/SP CMS, or a Macintosh with MacPascal was: Entering proca with a I Entering procb with a I Entering proca with a A Leaving proca with a A Leaving procb with a I Leaving proca with a I as I expected. Calling Borland Technical Support was no help, as they wanted a copy of the program on an IBM format disk. The technical support specialist asked me to send a copy of the program on a disk. When I asked "in what format?" she replied "IBM, of course." I guess CPM does not exist anymore. Obviously, I was quite surprised at the output, and now I wonder how they tested the compiler. It seems that a program as simple as the one above should have been tested. -- Stanley Dunn University of Maryland Department of Computer Science
Chris%ECLD@usc-ecl.arpa (Christopher Ho) (11/20/85)
There is a compiler option you need to turn on if you are going to write recursive code (I forget what it is, you'll need to look in the manual). This is because Turbo does not used stack-based storage areas for data, and so must invoke special code to save local data when a procedure is called recursively. -------
Cent.Mbeck%MIT-OZ@mit-mc.arpa (Mark Becker) (11/20/85)
Hello - I took your example and passed it through CP/M-80 Turbo version 1.0 and find that, if I leave the recursion switch defaulted off (i.e.; generate absolute code), I can reproduce your Turbo output. If I turn the switch on, i.e.; permit generation of recursive code, I get the same output you did from your other operating systems. Question: did you have the recursive-code switch turned on? Regards, Mark Becker Cent.Mbeck%Mit-OZ@Mit-MC -------
c55-hc@ucbbuddy.BERKELEY.EDU (Brent Chapman) (11/21/85)
<bugline> To compile a recursive program on a CPM-80 machine, you must set one of the compiler switches. I BELIEVE (I don't have the manual sitting in front of me) that the line that needs to be inserted is: {$A-} but I'm not absolutely certain; look it up in the back of the manual. NOTE that this bug/switch applies ONLY to CPM-80 version of Turbo. CPM-86 and MS-DOS do not need this switch, and may not even recognize it. Brent Chapman ucbvax!ucbbugs!chapman chapman@bugs.berkeley.arpa ucbvax!ucbamber!chapman chapman@amber.berkeley.arpa ucbvax!ucbbuddy!c55-hc c55-hc@buddy.berkeley.arpa Opinions expressed herein are strictly my own (but may be borrowed upon request, for a suitable fee).
db21@ihuxk.UUCP (Dave Beyerl) (11/21/85)
> Replace this line with your compiler bug > > I sat down to write the program for the next project I am going > to give to my Computer Science I class at home on my CPM system > with Turbo Pascal Version 3.00. The following program illustrates > the problem with the program I wrote: > > program junk(input,output); > procedure proca(chita:char); forward; > procedure procb(chitb:char); > begin > writeln('Entering procb with a ',chitb); > proca('A'); > writeln('Leaving procb with a ',chitb); > end; > procedure proca; > begin > writeln('Entering proca with a ',chita); > if chita = 'I' then procb('I'); > writeln('Leaving proca with a ',chita); > end; > begin > proca('I'); > end. > > The output using Turbo Pascal was: > > Entering proca with a I > Entering procb with a I > Entering proca with a A > Leaving proca with a A > Leaving procb with a I > Leaving proca with a A > > While the output for the same program on a VAX with BSD UNIX, > IBM VM/SP CMS, or a Macintosh with MacPascal was: > > Entering proca with a I > Entering procb with a I > Entering proca with a A > Leaving proca with a A > Leaving procb with a I > Leaving proca with a I > > as I expected. Calling Borland Technical Support was no help, > as they wanted a copy of the program on an IBM format disk. > The technical support specialist asked me to send a copy of the > program on a disk. When I asked "in what format?" she replied > "IBM, of course." I guess CPM does not exist anymore. > > Obviously, I was quite surprised at the output, and now I > wonder how they tested the compiler. It seems that a program > as simple as the one above should have been tested. > > -- Stanley Dunn > University of Maryland Department of Computer Science Because I happened to have a copy of my Turbo Pascal compiler handy, I tried the above program in Turbo. When I ran the program, I received the second set of outputs given in the above article. The version of Turbo that I have is identified as ver. 3.01A for the IBM. Apparently, Borland either corrected this problem in the subsequent point (.01) release or there is a significant difference between the CP/M and IBM versions of Turbo. Hopes this helps in tracking down the problem. For every problem there is one Dave Beyerl solution which is simple, neat, ihuxk!db21 and wrong!
johnson@noscvax.UUCP (Timothy A. Johnson) (11/23/85)
> Replace this line with your compiler bug > > I sat down to write the program for the next project I am going > to give to my Computer Science I class at home on my CPM system > with Turbo Pascal Version 3.00. The following program illustrates > the problem with the program I wrote: > > program junk(input,output); > procedure proca(chita:char); forward; > procedure procb(chitb:char); > begin > writeln('Entering procb with a ',chitb); > proca('A'); > writeln('Leaving procb with a ',chitb); > end; > procedure proca; > begin > writeln('Entering proca with a ',chita); > if chita = 'I' then procb('I'); > writeln('Leaving proca with a ',chita); > end; > begin > proca('I'); > end. > > The output using Turbo Pascal was: > > Entering proca with a I > Entering procb with a I > Entering proca with a A > Leaving proca with a A > Leaving procb with a I > Leaving proca with a A > > While the output for the same program on a VAX with BSD UNIX, > IBM VM/SP CMS, or a Macintosh with MacPascal was: > > Entering proca with a I > Entering procb with a I > Entering proca with a A > Leaving proca with a A > Leaving procb with a I > Leaving proca with a I > > as I expected. Calling Borland Technical Support was no help, > as they wanted a copy of the program on an IBM format disk. > The technical support specialist asked me to send a copy of the > program on a disk. When I asked "in what format?" she replied > "IBM, of course." I guess CPM does not exist anymore. > > Obviously, I was quite surprised at the output, and now I > wonder how they tested the compiler. It seems that a program > as simple as the one above should have been tested. > > -- Stanley Dunn > University of Maryland Department of Computer Science Under the PC-DOS version of Turbo 3.0, the program runs correctly with the same output as you have given for the other Pascals. The problem may be associated with the CP/M-80 Compiler Directive "A". The default is "A+" which inhibits recursive code. Switching to "A-" may solve your problem. This is documented on or about page 318 in the 3.0 manual. Timothy A. Johnson Computer Sciences Corporation