[Info-vax] VMS Software Q1 '23 Update

Arne Vajhøj arne at vajhoej.dk
Thu Jan 26 08:58:56 EST 2023


On 1/26/2023 2:06 AM, Dave Froble wrote:
> On 1/25/2023 9:24 PM, Arne Vajhøj wrote:
>> On 1/25/2023 8:36 PM, Dave Froble wrote:
>>> 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.
> 
> I will admit that my normal practice is to have any such declarations in 
> one place, and include the same definition is each subroutine that uses 
> it.  Of course, if it is modified, one must re-compile all routines that 
> include it.
> 
> :-)

Yep.

> I can be a little dense, but I fail to see the problem in John's 
> example.  If I understand it correctly, each routine defines the same 
> PSECT (I believe each common block has it's own PSECT, a Basic MAP 
> statement I'm rather sure does so) with a different definition.  So 
> what?  And yes, it might be confusing to some.

I think there are 3 problems:
A) different definition of the common block in different routines
B) initialization of the the data in multiple routines
C) A and B combined in such a way that the initialization partly overlaps

which I consider bad, very bad and disaster.

> And that brings this question.  What does:
> 
> integer*2 :: w1,w2='BBBB'X,w3,w4='BBBB'X
> 
> do?
> 
> Does both w1 and w2 get set to BBBB?  That is not what the comments 
> indicate?

I think it only initialize w2 (and w4).

I am so old that I use data statement for initialization.

:-)

Arne





More information about the Info-vax mailing list