[Info-vax] VAX BASIC global variables.

Stephen Hoffman seaohveh at hoffmanlabs.invalid
Fri Oct 15 12:42:41 EDT 2021


On 2021-10-15 09:42:54 +0000, E Thump said:

> On Friday, October 15, 2021 at 3:29:53 AM UTC+1, Stephen Hoffman wrote:
>> On 2021-10-15 00:23:46 +0000, E Thump said:
>> 
>>> Any VAX BASIC folk here?
>> Really VAX BASIC, and not BASIC on OpenVMS VAX with the
>> DEC/Compaq/HP/HPE/VSI BASIC compiler?
>> 
>> DEC/Compaq/HP/HPE/VSI BASIC replaced VAX BASIC a very long time ago
>> (back in VAX/VMS V3.x, IIRC)...
>> 
>> Assuming this is not the archaic VAX BASIC compiler, but rather the
>> DEC/Compaq/HP/HPE BASIC compiler...
>> 
>> https://vmssoftware.com/docs/VSI_BASIC_USER.pdf
>> https://vmssoftware.com/docs/VSI_BASIC_REF.pdf
>> 
>> The keyword you're looking for is EXTERNAL. See page 105 in the
>> reference manual, linked above.
>> 
>> COMMON (reference manual page 67) is not what you want.
>> 
>> 
>> --
>> Pure Personal Opinion | HoffmanLabs LLC
> 
> It identifies as "VAX BASIC V3.8-000" when I start it. Came with my 
> uVAX3100-80 running OpenVMS 6.2

V7.3 with whatever the latest BASIC for that era might be is the usual 
recommendation.

I will assume the usual 'must experience all the associated bugs and 
issues and limits of the oldest config' applies here.

I'm not going to wade through the old installer kits to figure out how 
ancient that BASIC is. It's ancient.

I'd forgotten about the problems with the BASIC manuals. They're really 
not very good. Ah, well.

> 
> Here's what I've done now:
> 
> External SUB adder (integer,integer)
> External INTEGER a,b
> 
> a=100
> b=200
> 
> print "a+b before sub: ",a+b
> call adder (10,20)
> print "a+b after sub: ",a+b
> 
> end program
> 
> sub adder (integer c,integer d)
> a=400
> b=1000
> print "a+b in sub: ",a+b
> print "c+d in sub: ",c+d
> end sub
> 
> compiles clean but throws this when linking :
> 
> %LINK-W-NUDFSYMS, 2 undefined symbols:
> %LINK-I-UDFSYM,         A
> %LINK-I-UDFSYM,         B
> %LINK-W-USEUNDEF, undefined symbol A referenced
>         in psect $CODE offset %X00000021
>         in module TEST$MAIN file SYS$USERS:[ECKY]TEST.OBJ;24
> %LINK-W-USEUNDEF, undefined symbol B referenced
>         in psect $CODE offset %X0000002C
>         in module TEST$MAIN file SYS$USERS:[ECKY]TEST.OBJ;24
> %LINK-W-USEUNDEF, undefined symbol A referenced
>         in psect $CODE offset %X00000048
>         in module TEST$MAIN file SYS$USERS:[ECKY]TEST.OBJ;24
> ......

Assuming that's all one source code module (showing your commands helps 
us figure out the details of your tests), you've told BASIC ADDER, A, 
and B are all EXTERNAL, and they're all in one source module; there are 
no EXTERNAL references, and (what the LINKER is telling you) no 
declarations. If you're trying to break the BASIC-preferrred 
modular-programming model within your app—I'd assumed that wasn't your 
goal (as that approach turns gnarly), but looking at the source code 
again, that does appear to be what you want to do—then using COMMON is 
one way to do that. I'd still keep clear of COMMON storage, as that 
usually ends badly as the apps increase in scale and complexity.


$ TYPE EXAMPLE.BAS
OPTION TYPE=EXPLICIT
DECLARE LONG A,B

a=100
b=200

print "a+b before sub: ",a+b
call adder (10,20)
print "a+b after sub: ",a+b

end program

sub adder (integer c,integer d)
a=400
b=1000
print "a+b in sub: ",a+b
print "c+d in sub: ",c+d
end sub
$ BASIC EXAMPLE
$ LINK EXAMPLE
$ RUN EXAMPLE
a+b before sub:              300
a+b in sub:    1400
c+d in sub:    33984
a+b after sub:               300
$
$
$ TYPE COMMON.BAS
OPTION TYPE=EXPLICIT
COMMON (HACK) LONG A, B

A=100
B=200

print "a+b before sub: ",a+b
call adder (10,20)
print "a+b after sub: ",a+b

end program

sub adder (integer c,integer d)
COMMON (HACK) LONG A, B
a=400
b=1000
print "a+b in sub: ",a+b
print "c+d in sub: ",c+d
end sub
$ BASIC COMMON
$ LINK COMMON
$ RUN COMMON
a+b before sub:              300
a+b in sub:    1400
c+d in sub:    33984
a+b after sub:               1400
$



-- 
Pure Personal Opinion | HoffmanLabs LLC 




More information about the Info-vax mailing list