BBS: Inland Empire Archive
Date: 04-14-92 (09:33) Number: 97
From: MATT HART Refer#: NONE
To: JASON GORMLEY Recvd: NO
Subj: Out of String Space Conf: (2) Quik_Bas
Continued from previous...
Variables : The variables held in Dgroup are simple strings
(non fixed length) and simple string arrays, simple
numeric variables (non arrays), TYPE definitions, CONSTants,
all descriptors to these variables (address' of simple
numerics, and address' & lengths of simple strings), pointers
to arrays, and stuff I think even Microsoft isn't sure about.
DATA : The stuff in DATA statements is in dgroup.
STATIC : If an array is DIMmed instead of REDIMmed, it's in
dgroup. If you don't use the '$DYNAMIC metacommand, then
most everything is in dgroup - wasting lots of space.
STATIC can increase the speed of your program - it makes things
near instead of far - but it won't be increased by very much.
The most common problem with Dgroup is bad usage of strings.
For example, if you have DATA statements that are then loaded
into a string array, your Dgroup is getting double whammied.
The DATA itself is in Dgroup, then the descriptors for the
string array are in Dgroup (4 bytes for each element), and then
the DATA itself is COPIED into the portion of Dgroup pointed to
as the string array! If you had 3 sets of 4K of data, that would
result in about 9K of Dgroup usage - or about 14% ! Put those DATA
statements out in a disk file and load them. Compiling your
program with /S will put quoted strings into the code segment and
out of dgroup. PRINT "This is a quoted string". Most string
arrays can be converted to far strings. See the next section for
an explanation on that. Use
insure that REDIMmed arrays are placed into far memory.
Third, Far Heap :
This is the most underutilized, least understand, and BIGGEST
available memory area. When a QB program starts, it takes all
available DOS memory and seperates it into it's CODE segment,
a 64K Dgroup chunk, and everything that's left is the far heap.
Fixed length string arrays
REDIM Strg(1 TO 100) AS STRING * 32
REDIM EmRec(1 TO 1) AS EmployeeType
and numeric arrays
REDIM Amounts(1 TO 100) AS DOUBLE
go into the far heap.
* Origin: Midnight Micro! V.32/REL (918)451-3306 (1:170/600)