[Info-vax] VMS Software Q1 '23 Update
Arne Vajhøj
arne at vajhoej.dk
Wed Jan 25 21:24:13 EST 2023
On 1/25/2023 8:36 PM, Dave Froble wrote:
> On 1/25/2023 6:50 PM, Arne Vajhøj wrote:
>> On 1/25/2023 5:55 PM, John Reagan wrote:
>>> Here's a nasty Fortran program where each subroutine initializes and
>>> reinitializes parts of the
>>> same common block in a particular order.
>>>
>>> subroutine print_common
>>> common /mypsect/ i1,i2
>>> integer*4 :: i1,i2
>>> write (*,10) i1,i2
>>> 10 format (' ',Z8,' ',Z8)
>>> return
>>> end
>>>
>>> subroutine update_longwords
>>> common /mypsect/ i1,i2
>>> c start with putting hex AAAAAAAA into both longwords
>>> integer*4 :: i1='AAAAAAAA'X,i2='AAAAAAAA'X
>>> return
>>> end
>>>
>>> subroutine update_words
>>> c and update bottom words with BBBB
>>> common /mypsect/ w1,w2,w3,w4
>>> integer*2 :: w1,w2='BBBB'X,w3,w4='BBBB'X
>>> return
>>> end
>>>
>>> subroutine update_bytes
>>> c and update bottom bytes with CC
>>> common /mypsect/ b1,b2,b3,b4,b5,b6,b7,b8
>>> integer*1 :: b1,b2,b3,b4='CC'X,b5,b6,b7,b8='CC'X
>>> return
>>> end
>>>
>>> program main
>>> c by now, the two longwords in the common should be
>>> c CCBBAAAA CCBBAAAA
>>> call print_common
>>> end
>>
>> That is horrible code IMHO.
>
> I find that an interesting comment ...
>
> Perhaps it is doing what someone needed it to do ...
I don't think they did for fun.
But I believe there are better ways to do that.
>> Initializing the same common block in multiple subroutines
>> is not something I would ever do.
>
> You've never redefined the data type of some data?
> Consider:
>
> Record TLS
> Variant
> Case
> String Rec$=42
> Case
> Byte Byte1%
> Byte VerMajor%
> Byte VerMinor%
> Long UnixDate%
> String Random$=28
> Long SessionID%
> Word Cypher%
> Byte Method%
> End Variant
> End Record
>
>
> In this case the Basic RECORD statement allows multiple variants of the
> same memory, basically allowing different types of variables to be used
> on the same memory location(s). Useful, and a relatively later addition
> to the language. Similar to what is called a structure in C and perhaps
> other languages.
That is really a different thing than initializing the same psect
multiple times in different places.
Having to overlay different types is a common feature in languages.
Pascal got the variant case record similar to the Basic code above.
C got union. In Fortran it can be achieved using common blocks, but
the right way (IMHO) is to use equivalence.
> Perhaps some would not want variants, but I for one have used them many
> times.
>
> Map (D) Long D1%
> Map (D) String D1$=4
>
> Now in a MAP statement, whiich is rather similar to a COMMON block,
> multiple definitions of the MAP statement allows for a similar
> redefinition of the same memory. In the above, a longword value is
> stored in 4 bytes of memory. The redefinition of the MAP statement
> allows the same memory to be labeled as a string or a longword.
>
> It's been useful to me in the past.
I am not arguing against this.
But in Fortran this should not be done using common blocks but
via equivalence.
integer*4 iv
character*4 sv
equivalence (iv,sv)
It has local scope and is readable.
And if necessary it can be combined with a common block.
In extremely rare cases there may even be a good reason to
have different definition (different types) in different routines.
It is difficult to read as there are no indication in the
individual routine that it has a different definition elsewhere.
But one never knows what can be required to solve a problem.
But I can not believe there are any cases where I would
consider it good to static initialize parts of a common
block in different routines.
Arne
More information about the Info-vax
mailing list