bas7advr.hlp (Topic list)
VARPTR, VARSEG Functions Details
  Syntax  Details  Example                 Contents  Index  Back
──────────────────────────────────────────────────────────────────────────────
VARPTR and VARSEG return the address of a variable (for numeric variables)
or the address of a string descriptor (for near string variables).
 
VARPTR(variablename)
VARSEG(variablename)
     ■ The argument variablename can be any BASIC variable, including a
       record variable or record element.
 
Usage Notes
    ■ When variablename is a numeric variable, the VARPTR function returns
      an unsigned integer (the offset of the variable within its segment).
    ■ When variablename is a numeric variable, the VARSEG function returns
      an unsigned integer (the segment address of the variable).
    ■ When variablename is a string variable, VARSEG returns the segment
      address of the variable, and VARPTR returns the offset address of
      the variable.
    ■ If variablename is not defined before VARPTR or VARSEG is called,
      the variable is created and its address is returned.
    ■ VARPTR and VARSEG are often used with Absolute, BLOAD, BSAVE,
      Interrupt, PEEK, POKE, or when passing arrays to procedures written
      in other languages.
 
Note on Mixed-Language Programming
    ■ Do not pass expanded memory arrays to non-BASIC procedures. (If
      you start QBX with the /Ea switch, any of these arrays may be stored
      in expanded memory:
        -  Numeric arrays < 16K in size
        -  Fixed-length string arrays < 16K in size
        -  User-defined-type arrays < 16K in size
    ■ If you want to pass arrays to non-BASIC procedures, first start QBX
      without the /Ea switch. (Without the /Ea switch, no arrays are
      stored in expanded memory.)
    ■ For more information on using expanded memory, see
      Using Expanded Memory.
 
Usage Notes
    ■ When using VARPTR or VARSEG to get the address of an array, use the
      first element of the array as the argument:
 
        DIM A(150)
        .
        .
        .
        ArrAddress=VARPTR(A(1))
 
    ■ You can use VARPTR alone to get the address of a numeric variable
      stored in DGROUP. You must use both VARPTR and VARSEG to get the
      complete address of a numeric variable stored in far memory.
    ■ It is not meaningful to use VARSEG and VARPTR for far strings, since
      the format of the far strings' string descriptor is different from
      the string descriptor for near strings. See the StringAddress for
      routine information on locating the address of a far string's
      string descriptor.
    ■ You cannot use VARPTR to get the address of a file's buffer.
      Use the FILEATTR function to get information about a file.
    ■ Programs written in earlier versions of BASIC that used VARPTR to
      access numeric arrays may no longer work. You must now use a
      combination of VARPTR and VARSEG. For example, the following
      QuickBASIC version 3.0 fragment no longer works correctly:
 
        DIM Cube(675)
        .
        .
        .
        BSAVE "graph.dat",VARPTR(Cube(1)),2700
 
      The fragment could be rewritten as follows to work in the current
      version of BASIC:
 
        DIM Cube(675)
        .
        .
        .
        ' Change segment to segment containing Cube.
        DEF SEG=VARSEG(Cube(1))
        BSAVE "graph.dat",VARPTR(Cube(1)),2700
        ' Restore BASIC segment.
        DEF SEG
 
    ■ The VARSEG function, combined with VARPTR, replaces the PTR86
      subprogram used in previous versions of BASIC.
 
Programming With OS/2 Protected Mode
    ■ The VARSEG function returns the selector of the specified variable
      or array.
 
Important
    ■ Because many BASIC statements move variables in memory, use the
      values returned by VARPTR and VARSEG immediately after the functions
      are used.