ReDim
 
Определяет или изменяет размер массива переменной длины

Синтаксис

Декларация динамического массива:
ReDim [ Shared ] symbolname([subscript [, ...]]) As datatype [, ...]
ReDim [ Shared ] As datatype symbolname([subscript [, ...]]) [, ...]

Изменение размера динамического массива:
ReDim [ Preserve ] symbolname([subscript [, ...]]) [, ...]

Параметры

Shared
Определяет shared (файловый Scope) доступ к массиву по всему модулю.
Preserve
При использовании существующего массива, содержимое массива будет сохранено во время изменения размера. Следует отметить, что в некоторых случаях Preserve не сохранит данные в своем первоначальном индексе, см. ниже.
symbolname
Новый или существующий ID(идентификатор) массива.
subscript: [ lowerbound To ] upperbound
Нижняя и верхняя границы диапазона для измерения массива. Нижняя граница по умолчанию равна нулю (0), или по умолчанию Base, если не указано.
datatype
Тип элементов, содержащихся в массиве.

Описание

ReDim может быть использован для определения нового массива переменной длины, или изменения размера существующего массива переменной длины. ReDim всегда создает массивы переменной длины, поэтому, в отличие от Dim, массивы переменной длины могут быть определены с постоянными индексами.

При определении нового массива переменной длины, его значения элементов строятся по умолчанию. Для простых типов данных как Integer или Double, элементы инициализируются нулевым значением (0). Для определяемых пользователем типов будет вызываться конструктор по умолчанию.

ПРИМЕЧАНИЯ:
  • ReDim Preserve не во всех случаях может работать как ожидается:
Текущим поведением Preserve является сохранение исходных смежных данных в памяти и только расширение или усечение размера памяти.
Его поведение (с одним измерением) корректно определяется только тогда, когда изменяется верхняя граница. Если изменяется нижняя граница, то данные, по сути начинают переход в новую нижнюю границу.
С несколькими измерениями, только верхняя граница первого измерения может быть безопасно увеличена. Если первое измерение уменьшается, существующие отображаемые данные могут быть потеряны. Если изменяется в размерах нижняя граница, последствия трудно предсказать.

  • ReDim не могут быть использованы на массивах фиксированного размера - то есть с массивами с постоянными границами, созданными с Dim. Это включает в себя массивы, содержащиеся в UDT (определяемые пользователем Type), потому что в настоящее время только массивы фиксированного размера поддерживаются в UDT. Это также включает в себя массивы фиксированной длины, передаваемые в качестве параметров в функцию. FreeBASIC не может помешать вам попробовать это во время компиляции, но результаты во время выполнения будут неопределенными.

  • Использование ReDim в процедуре-элементе с массивом, который содержит экземпляр класса объекта , приведет к плохим последствиям.

Пример

'' Определить массив переменной длины с 5 элементами
''
ReDim array(0 To 4) As Integer

For index As Integer = LBound(array) To UBound(array)
    array(index) = index
Next

'' Изменение размера массива переменной длины до 10 элементов 
'' (нижняя граница должна быть такая же)
ReDim Preserve array(0 To 9) As Integer

Print "index", "value"
For index As Integer = LBound(array) To UBound(array)
    Print index, array(index)
Next

Эта программа выведет:

index         value
 0             0
 1             1
 2             2
 3             3
 4             4
 5             0
 6             0
 7             0
 8             0
 9             0

'' Определить массива переменной длины
Dim array() As Integer

'' ReDim массив имеет 3*4 элементов
ReDim array(1 To 3, 1 To 4)

Dim As Integer n = 1, i, j

Print "3 * 4:"
Print
For i = LBound(array, 1) To UBound(array, 1)
    For j = LBound(array, 2) To UBound(array, 2)
        array(i, j) = n
        Print Using "##  "; array(i, j);
        n += 1
    Next
    Print
Next
Print


'' ReDim Preserve массив имеет 4*4 элементов, сохраняя содержимое
'' (только первая верхняя граница должна быть изменена)
ReDim Preserve array(1 To 4, 1 To 4) As Integer

Print "4 * 4:"
Print
For i = LBound(array, 1) To UBound(array, 1)
    For j = LBound(array, 2) To UBound(array, 2)
        Print Using "##  "; array(i, j);
    Next
    Print
Next
Print


'' ReDim Preserve массив имеет 2*4 элементов, сохранение, но обрезание содержимого
'' (только первая верхняя граница должна быть изменена)
ReDim Preserve array(1 To 2, 1 To 4) As Integer

Print "2 * 4:"
Print
For i = LBound(array, 1) To UBound(array, 1)
    For j = LBound(array, 2) To UBound(array, 2)
        Print Using "##  "; array(i, j);
    Next
    Print
Next
Print

Эта программа выведет:

3 * 4:

 1   2   3   4
 5   6   7   8
 9  10  11  12

4 * 4:

 1   2   3   4
 5   6   7   8
 9  10  11  12
 0   0   0   0

2 * 4:

 1   2   3   4
 5   6   7   8

Отличия от QB

  • Preserve был в Visual Basic, но не в QBASIC.
  • Многомерные массивы в FreeBASIC являются в row-major порядке, а не в column-major.

См. также