Определяет или изменяет размер массива переменной длины
Синтаксис
Декларация динамического массива:
Изменение размера динамического массива:
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.
См. также