[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