Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: ReDim Preserve - какая-то ошибка... Добавлено: 15.08.04 13:09  

Автор вопроса:  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. В чем может быть дело?

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #1
Добавлено: 15.08.04 13:18
 Может многомерные он не берёт. А вообще при наличии кода всегда легче ошибки искать.
 А то флуд получается. Все равно рано или поздно кто нибудь скажет тебе показать код, но его просьба уже будет началом флуда.

 Так что давай в сжатом виде.

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 15.08.04 13:29
У многомерного массива редимить можно только внешнюю границу, т.е. то что стоит последним...

И кода тут не надо :)

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 15.08.04 15:07
Странно, последним обычно стоит элемент, чаще всего изменяющийся при движении по памяти (по крайней мере, в Си так), следовательно, его редим будет менять размер самых маленьких групп, что технически весьма проблематично. А если менять внешнюю границу, тогда понадобится просто добавлять в конец самые большие группы.
Типа 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)

Ответить

Номер ответа: 4
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 15.08.04 15:26
Работает:
    ;Dim a() As Byte
    ReDim a(10, 20)
    ReDim Preserve a(10, 30)

Неработает:
    ;Dim a() As Byte
    ReDim a(10, 20)
    ReDim Preserve a(30, 30)

Ответить

Номер ответа: 5
Автор ответа:
 LIS



Вопросов: 7
Ответов: 256
 Профиль | | #5 Добавлено: 16.08.04 04:32
Remarks

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.

ReDim X(10, 10, 10)
. . .
ReDim Preserve X(10, 10, 15)

Similarly, when you use Preserve, you can change the size of the array only by changing the upper bound; changing the lower bound causes an error.

Ответить

Номер ответа: 6
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #6
Добавлено: 16.08.04 06:14
 Ох уж эти лентяи из Микрософта. А ещё кричали что VB - самый удобный язык в мире.
 Сокорее всего многомерный массив расположен в памяти так:
 Например A(3,4,5)
 333444455555
 Вероятно заголовком массива служит таблица адресов каждой колонки.
 Что то типа: Колонка1 - Смещение1 и т.д.
 
 Скорее всего способ хранения многомерного массива не позволяет вставить дополнительный элемент внутрь.
 Или вариант что переразмерность массива требует дополнительных ресурсов и усилий от создателей VB.

 Кстати, а как с этим делом обстоит в VB.NET?

Ответить

Номер ответа: 7
Автор ответа:
 Aндрей



ICQ: 259020622 

Вопросов: 30
Ответов: 71
 Профиль | | #7 Добавлено: 14.05.06 16:05
У меня похожая проблема
Вот так все работает
 ReDim Preserve itemsDef(itemsNum) As Long

А при работе с многомерными ошибками генерируется ошибка "Нижний индекс вне диапазона"

ReDim Preserve questRan(questCount, 2) As Long
ReDim Preserve captionsRan(questCount, someVar) As Long

Хорошо что у меня четыре многомерных массива и я их разобью на одномерные, а иначе вашатся...

Ответить

Номер ответа: 8
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 14.05.06 18:17
Кстати, а как с этим делом обстоит в VB.NET?

тоже самое.. если с Preserve, то изменять можно только последний размер...

Ответить

Номер ответа: 9
Автор ответа:
 AndreyMp



ICQ: 237822510 

Вопросов: 28
Ответов: 1182
 Профиль | | #9 Добавлено: 14.05.06 18:27
Цитата из одного учебника. Особое внимание прошу обратить на замечание.

Объявление динамического массива
В случае, когда размер массива заранее неизвестен. 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 позволяет изменять только верхнюю границу последней размерности многомерных размеров.

Ответить

Номер ответа: 10
Автор ответа:
 Pashenko



ICQ: 176176951 

Вопросов: 14
Ответов: 655
 Профиль | | #10 Добавлено: 15.05.06 11:08
http://vbnet.ru/samples/download.aspx?id=691

Слегка геморройно, но работает.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам