Автор вопроса: Aracon | Web-сайт:aracon-studios.com | ICQ: 221881915
У меня появился какой-то глюк с ReDim Preserve. Я задаю массив, затем при загрузке формы делаю
ReDim zonelist(0,0)
При нажатии на кнопку меняю размер массива:
iIndex=1
ReDim Preserve zonelist(iIndex,0)
Но VB выдает ошибку "Subscript out of range". Причем ошибка не возникает, если убрать Preserve. В чем может быть дело?
Может многомерные он не берёт. А вообще при наличии кода всегда легче ошибки искать.
А то флуд получается. Все равно рано или поздно кто нибудь скажет тебе показать код, но его просьба уже будет началом флуда.
Странно, последним обычно стоит элемент, чаще всего изменяющийся при движении по памяти (по крайней мере, в Си так), следовательно, его редим будет менять размер самых маленьких групп, что технически весьма проблематично. А если менять внешнюю границу, тогда понадобится просто добавлять в конец самые большие группы.
Типа a(2,2):
a(0,0) a(0,1) a(0,2) a(1,0) a(1,1) a(1,2) a(2,0) a(2,1) a(2,2)
Если ресайзить второй размер, то придется менять размер каждой группы a(0,x); a(1,x); a(2,x), а вот если первый, то просто добавить в конец a(3,0);a(3,1);a(3,2)
The ReDimstatement is used to size or resize a dynamic array that has already been formally declared using a Private, Public, or Dim statement with empty parentheses (without dimension subscripts).
You can use the ReDim statement repeatedly to change the number of elements and dimensions in an array. However, you can't declare an array of one data type and later use ReDim to change the array to another data type, unless the array is contained in a Variant. If the array is contained in a Variant, the type of the elements can be changed using an As type clause, unless you’re using the Preserve keyword, in which case, no changes of data type are permitted.
If you use the Preserve keyword, you can resize only the last array dimension and you can't change the number of dimensions at all. For example, if your array has only one dimension, you can resize that dimension because it is the last and only dimension. However, if your array has two or more dimensions, you can change the size of only the last dimension and still preserve the contents of the array. The following example shows how you can increase the size of the last dimension of a dynamic array without erasing any existing data contained in the array.
Ох уж эти лентяи из Микрософта. А ещё кричали что VB - самый удобный язык в мире.
Сокорее всего многомерный массив расположен в памяти так:
Например A(3,4,5)
333444455555
Вероятно заголовком массива служит таблица адресов каждой колонки.
Что то типа: Колонка1 - Смещение1 и т.д.
Скорее всего способ хранения многомерного массива не позволяет вставить дополнительный элемент внутрь.
Или вариант что переразмерность массива требует дополнительных ресурсов и усилий от создателей VB.
Цитата из одного учебника. Особое внимание прошу обратить на замечание.
Объявление динамического массива
В случае, когда размер массива заранее неизвестен. Visual Basic позволяет использовать динамические массивы, размеры которых можно изменять во время выполнения. Применение динамических массивов позволяет эффективно управлять памятью, выделяя память под большой массив лишь на то время, когда этот массив используется, а затем освобождая ее.
Создание динамического массива осуществляется следующим образом:
1. Объявляется массив с помощью ключевых слов, используемых при создании массива фиксированного размера. Список размерностей массива остается пустым. При объявлении глобального массива необходимо выбрать ключевое слово Public, при объявлении массива на уровне модуля — Dim, при объявлении массива в процедуре — Dim или static. Например,
Dim intCountPar О As Integer
2. С помощью выполняемого оператора ReDim указывается размерность массива в виде числа или выражения. Синтаксис оператора ReDim аналогичен синтаксису оператора объявления массива фиксированного размера. Например, размерность массива может быть задана любым из следующих способов:
ReDim intCountPar (х)
ReDim intCountPar (20)
ReDim intCountPar (1 То 20)
При выполнении оператора ReDim данные, размещенные в массиве ранее, теряются. Это удобно в том случае, если данные вам больше не нужны и вы хотите переопределить размерность массива и подготовить его для размещения новых данных. Если вы хотите изменить размер массива, не потеряв при этом данных, то необходимо воспользоваться оператором ReDim с ключевым словом Preserve. Например, приведенный ниже программный код увеличивает размер массива на единицу без потери хранящихся в массиве данных:
ReDim Preserve intCountPar (X + 1)
Замечание
Использование оператора ReDim с ключевым словом Presterve позволяет изменять только верхнюю границу последней размерности многомерных размеров.