Using User-Defined Types with subroutines and functions

Subroutines and functions can process User-Defined Types as well as any other data type.  This topic covers the following topics:

·          Passing fields as arguments

·          Passing records as arguments

·          Passing record arrays as arguments

Passing fields as arguments

Members in User-Defined Types that are one of the built-in PowerBASIC types (INTEGER, WORD, STRING, and so on) can be passed to procedures and functions as if they were simple variables.  For example, given the User-Defined Type PatientRecord, as follows:

TYPE PatientRecord

  FullName  AS STRING * 32

  AmountDue AS DOUBLE

  IdNum     AS LONG

END TYPE

DIM Patient AS PatientRecord

…you could use a procedure PrintStatement:

SUB PrintStatement(Id AS LONG, AmountPastDue AS DOUBLE)

  ' access Id and AmountPastDue

  ...

END SUB

…like this:

CALL PrintStatement(Patient.IdNum, Patient.AmountDue)

Passing records as arguments

You can also write your procedures and functions to accept arguments of User-Defined Types.  This is especially useful if you want to pass many arguments; rather than have a long argument list, you can pass a single User-Defined Type.  For example, given the PatientRecord User-Defined Type discussed in the previous section, you could write your PrintStatement procedure as follows:

SUB PrintStatement(Patient AS PatientRecord)

  ' access Patient.IdNum and Patient.AmountDue

  ...

END SUB

You'd call PrintStatement like this:

CALL PrintStatement(Patient)

Passing record arrays as arguments

Procedures and functions can accept arrays of records as easily as they can accept arrays of other Types.  For example, if you had an array of PatientRecords, each containing a patient record with an amount due, you could write a function that returns the total amount due for all the patient records in the array:

FUNCTION TotalAmountDue(Patients() AS PatientRecord)

  DIM total AS DOUBLE

  RESET total

  FOR ix = LBOUND(Patients) TO UBOUND(Patients)

    total = total + Patients(ix).AmountDue

  NEXT

  TotalAmountDue = total

END FUNCTION

You might call the function like this:

DIM Patients(1 TO 100) AS PatientRecord

...

x$ = "Total amount due:" + STR$(TotalAmountDue(Patients()))

 

 

See Also

User-Defined Types (UDTs)

Storage requirements and restrictions

Unions