FreeBasic Preserve Keyword
last modified June 16, 2025
The FreeBasic Preserve
keyword is used with Redim
to resize dynamic arrays while keeping their existing contents. Without
Preserve
, resizing an array erases all its elements.
Basic Definition
In FreeBasic, Preserve
is a modifier for the Redim
statement. It ensures that existing array elements are preserved when
changing the array's dimensions.
The Preserve
keyword can only be used when changing the last
dimension of a multi-dimensional array. It's essential for maintaining
data integrity when working with dynamic arrays.
Basic Array Resizing
This example shows the difference between resizing with and without Preserve.
Dim arr() As Integer = {1, 2, 3} Redim arr(4) ' Resize without Preserve Print "Without Preserve:" For i As Integer = LBound(arr) To UBound(arr) Print arr(i); Next Print Dim arr2() As Integer = {1, 2, 3} Redim Preserve arr2(4) ' Resize with Preserve Print "With Preserve:" For i As Integer = LBound(arr2) To UBound(arr2) Print arr2(i); Next
The first array loses its values when resized without Preserve. The second array keeps its original values in the resized array. New elements are initialized to zero for numeric types.
Preserving String Arrays
The Preserve keyword works similarly with string arrays.
Dim names() As String = {"Alice", "Bob", "Charlie"} Redim Preserve names(5) names(3) = "David" names(4) = "Eve" For i As Integer = LBound(names) To UBound(names) Print i; ": "; names(i) Next
This example shows how string arrays preserve their contents when resized. Original elements remain intact while new elements are empty strings by default. We then fill some of the new positions.
Multi-dimensional Arrays
With multi-dimensional arrays, only the last dimension can be resized.
Dim matrix(1 To 2, 1 To 2) As Integer matrix(1, 1) = 1 matrix(1, 2) = 2 matrix(2, 1) = 3 matrix(2, 2) = 4 Redim Preserve matrix(1 To 2, 1 To 3) ' Only last dimension can change ' Fill new elements matrix(1, 3) = 5 matrix(2, 3) = 6 For i As Integer = 1 To 2 For j As Integer = 1 To 3 Print matrix(i, j); " "; Next Print Next
This demonstrates resizing a 2D array while preserving contents. Note that we can only change the last dimension (columns in this case). Attempting to change the first dimension would cause an error.
Preserve with User-Defined Types
Arrays of user-defined types can also be preserved during resizing.
Type Person name As String age As Integer End Type Dim people() As Person Redim people(2) people(0).name = "Alice" : people(0).age = 25 people(1).name = "Bob" : people(1).age = 30 Redim Preserve people(4) people(2).name = "Charlie" : people(2).age = 35 For i As Integer = LBound(people) To UBound(people) If Len(people(i).name) > 0 Then Print people(i).name; " ("; people(i).age; ")" Else Print "[Empty]" End If Next
This example shows preserving an array of custom types. Existing Person records remain intact after resizing. New elements are initialized with default values (empty string for name, 0 for age).
Performance Considerations
Using Preserve has some performance implications worth noting.
Dim bigArray(1000000) As Integer ' 1 million elements ' Fill array with values For i As Integer = LBound(bigArray) To UBound(bigArray) bigArray(i) = i Next ' Time resizing with Preserve Dim t As Double = Timer Redim Preserve bigArray(2000000) Print "Time to resize with Preserve: "; Timer - t; " seconds" ' Compare to creating new array Dim t2 As Double = Timer Dim newArray(2000000) As Integer For i As Integer = 0 To 1000000 newArray(i) = i Next Print "Time to create new array: "; Timer - t2; " seconds"
This benchmark compares resizing with Preserve versus creating a new array. Preserve can be slower for large arrays because it must copy all existing elements. For frequent resizing, consider alternative data structures.
Error Handling with Preserve
It's important to handle potential errors when using Preserve.
Dim arr() As Integer = {1, 2, 3} ' Attempt invalid resize (smaller array) On Error Goto error_handler Redim Preserve arr(1) Print "Resize successful" Exit Sub error_handler: Print "Error "; Err; ": "; Error(Err) Resume Next
This example shows error handling when resizing fails. Trying to make an array smaller with Preserve causes an error. Always check array bounds before resizing and implement proper error handling.
Best Practices
- Minimize resizes: Avoid frequent small resizes; estimate needed size upfront.
- Check bounds: Always verify new dimensions are valid.
- Error handling: Implement error handling for resize operations.
- Multi-dimensional: Remember only last dimension can be changed.
- Alternatives: Consider linked lists for frequently changing data.
This tutorial covered the FreeBasic Preserve
keyword with practical
examples showing its usage in different scenarios.
Author
List all FreeBasic Tutorials.