Passing UDT to function

UDT variables can be passed to any function - by value or by reference.

As the UDT's represent a group of multiple other types, their memory footprint can be larger.

As with all other variables, byRef is faster, while byVal ensures the value does not get altered.

General rules of thumb:

  • if changing the UDT variable from function is wanted or no issue, always use byRef
  • if you know you will not change the value in function, always use byRef
  • in all the other cases use byVal, it will ensure the UDT variable value will not change

Little example to illustrate the difference.

TYPE Point2D
  x AS SINGLE
  y AS SINGLE
END TYPE

DIM point AS Point2D

Here we have our Point2D example again.

Imagine you want to change the element values via function. You can do it like:

Point2DSetXY(point, 1, 2)

SUB Point2DSetXY(byRef point AS Point2D, x AS SINGLE, y AS SINGLE)
  point.x = x
  point.y = y
END SUB

ByRef is wanted here, this function is explicitly designed to change the element values.

Another example:

msgBox Point2DAsString(point)

FUNCTION Point2DAsString(byRef point AS Point2D) AS STRING
  RETURN strFormat$("[{1}, {2}]", point.x, point.y)
END FUNCTION

ByRef is safe to use here, because we use it just to make the function call faster. The value of Point2D is not altered here, just read.

And last, but not least:

SINGLE halfSum = Point2DGetSumOfHalfs(point)

FUNCTION Point2DGetSumOfHalfs(byVal point AS Point2D) AS SINGLE
  point.x /= 2
  point.y /= 2
  
  RETURN point.x + point.y
END FUNCTION

ByVal is needed, as you need to modify the variable for purpose of the calculation, but do not want to change the original variable.