BBS: Inland Empire Archive Date: 05-30-92 (22:07) Number: 168 From: QUINN TYLER JACKSON Refer#: NONE To: ALL Recvd: NO Subj: string lesson Conf: (2) Quik_Bas
' This short program demonstrates how QuickBASIC deals with String Variables
' in memory. VARPTR points to a four byte string descriptor which is in
' the format: LL LH AL AH, or LengthLow LengthHigh AddressLow AddressHigh.
' With this information in hand, the intermediate programmer can perform
' string operations directly upon descriptors, thus giving him the power
' to deal with pointers, rather than with the strings themselves. For
' example, by swapping the 4 descriptor bytes of two string variables, one
' has performed a SWAP function without actually having to move the elements
' inside the string. If the strings are long, say 5000 bytes each, a total
' of 8 elements are swapped instead of 10000, which is faster by any
' programmer's standards! I'll leave the mechanics of this up to the
' members of this echo!
' Cheers, Quinn Tyler Jackson
' STRDESC.BAS v1.0 for release to public domain: May 1992
CLS
DO
INPUT "Please input a string: ", our.string$
' Be aware that in a larger, multi-segmented program, or in programs compiled
' with the /AH option, it is safest to also keep track of the VARSEG, since
' it may not be the same as the DGROUP!
Descriptor.Address = VARPTR(our.string$)
StrOne$ = CHR$(PEEK(Descriptor.Address))
StrTwo$ = CHR$(PEEK(Descriptor.Address + 1))
AddOne$ = CHR$(PEEK(Descriptor.Address + 2))
AddTwo$ = CHR$(PEEK(Descriptor.Address + 3))
' Convert these LB HB values into decimal format for humans
' Here, I have used a trick using CVI rather than the more lengthy
' algebraic convesion algorithm. It is much simpler this way!
String.Length = CVI(StrOne$ + StrTwo$)
String.Address = CVI(AddOne$ + AddTwo$)
PRINT "String Length: "; String.Length
PRINT "String HEX Offset: "; HEX$(String.Address)
PRINT
PRINT "The string itself: '";
' This loop reads the string from the memory addresses pointed to
' by bytes AL and AH in the descriptor....
FOR q = 0 TO String.Length - 1
PRINT CHR$(PEEK(q + String.Address));
NEXT q
PRINT "'"
PRINT : PRINT : PRINT : PRINT "Any key to continue, Q to quit..."
SLEEP
LOOP UNTIL UCASE$(INKEY$) = "Q"
--- Maximus/2 2.01wb
* Origin: The Nibble's Roost, Richmond BC Canada 604-244-8009 (1:153/918)

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET