Return the total or physical length of any PowerBASIC variable.
x& = SIZEOF(target)
Particularly useful for determining the maximum length of a fixed-length string, nul-terminated string, or User-Defined Type. It provides similar functionality to LEN, which returns the current length of a data item.
target can be the name of any variable type (fixed-length string, nul-terminated string, User-Defined Type (UDT) variable or definition, etc).
When measuring the size of a padded (aligned) UDT variable or definition with the SIZEOF (or LEN) statement, the measured length includes any padding that was added to the structure. For example, the following UDT structure:
TYPE LengthTestType DWORD
a AS INTEGER
' more code here
DIM abc AS LengthTestType
x& = SIZEOF(abc) ' or use SIZEOF(LengthTestType)
Returns a length of 4 bytes in x&, since the UDT was padded with 2 additional bytes to enforce DWORD alignment. Note that the SIZEOF of individual UDT members returns the true size of the member without regard to padding or alignment. In the previous example, SIZEOF(abc.a) returns 2.
When used on a dynamic (variable length) string, SIZEOF returns 4, which is the size of the string handle. To obtain the length of the string data in the dynamic string, use the LEN function. SIZEOF also returns 4 for pointer variables, since a pointer is always stored as a DWORD.
When used with a dereferenced pointer (i.e., SIZEOF(@p), SIZEOF returns the size of the pointer target variable type, as defined in the DIM x AS y PTR [* pSize] statement.
For example, with a dynamic string pointer, SIZEOF returns 4. If the pointer target is a fixed-length string, UDT, Union, or nul-terminated string, SIZEOF returns the size of the target data structure. However, if the pointer is declared to reference an nul-terminated with no specific target size (i.e., DIM a AS STRINGZ PTR), SIZEOF returns 0.
Likewise, if SIZEOF is used on a
SUB ProcessData(BYREF szText AS STRINGZ)
' Within this Sub, SIZEOF(szText) will return 0 because there is no explicit length specification
DIM Strval AS STRINGZ * 10
Strval = "test"
' SIZEOF(Strval) = 10, LEN(Strval) = 4
DIM Intval AS QUAD
Intval = 1
' SIZEOF(Intval) = 8, LEN(Strval) = 8
DIM CustName AS STRING
CustName = "Fred Dagg"
' SIZEOF(CustName) = 4, LEN(CustName) = 9
m1(1 TO 1024) AS BYTE
DIM p1 AS STRING PTR
DIM p2 AS STRING PTR * 1024
DIM p3 AS Arrs PTR
DIM p4 AS STRINGZ PTR
DIM p5 AS STRINGZ PTR * 64
' Results of SIZEOF on these pointers:
' SIZEOF(p1) = 4, SIZEOF(@p1) = 4
' SIZEOF(p2) = 4, SIZEOF(@p2) = 1024
' SIZEOF(p3) = 4, SIZEOF(@p3) = 1024
' SIZEOF(p4) = 4, SIZEOF(@p4) = 0
' SIZEOF(p5) = 4, SIZEOF(@p5) = 64
' SIZEOF(Arrs) = 1024