Ошибка в операторе Redim при Option VBASupport 1

Автор sokol92, 11 августа 2020, 17:27

0 Пользователи и 1 гость просматривают эту тему.

sokol92

Option VbaSupport 1
Sub TestRedim4
  Dim arr1, arr2(0)
  arr1=arr2
  Redim arr2(0)   
  Msgbox arr1(0)
End Sub


При попытке выполнения Msgbox возникает Runtime error 9 "Index out of defined range".
О баге сообщил.

На мой взгляд, при наличии опции VBASupport 1 присвоение переменной массива должно, как в VBA, создавать копию массива (а не присваивать указатель, как это делается для объектов).
Владимир.

rami

Если использовать ключевое слово Preserve, ошибки не возникает.
Option VbaSupport 1
Sub TestRedim4
  Dim arr1, arr2(0)
  arr1=arr2
  Redim Preserve arr2(0)
  Msgbox arr1(0)
End Sub

mikekaganski

Надо начать с того, что дело даже ещё не в копировании или использовании ссылки. Ни в одном из этих случаев не должно быть ошибки, хотя дальнейшее поведение, конечно, будет отличаться. ReDim arr2(0) должно оставить возможность обращаться к объекту с индексом ноль (будь то копия или тот же объект).
С уважением,
Михаил Каганский

sokol92

Чистое предположение: при Redim (стартовое сообщение) создается новый массив, старый массив удаляется (несмотря на ссылку из arr1).
Владимир.

bk

Этот код не работает и на VBA: пишет, что к статическому массиву arr2(0) не применяется оператор ReDim. Даже если добавить Preserve, как это предложил выше rami. (Нужен динамический массив - работает вот это объявление массива - arr2(), но и здесь ReDim, как это и положено помещается до формирования массива).  Возможно, что в OO Basic эта ошибка реализуется ошибкой 9 (нет объекта, на который ссылаются). Тогда не понятно, почему в данном случае срабатывает конструкция Redim Preserve arr2(0).

sokol92

Цитата: bk от 16 августа 2020, 01:03Этот код не работает и на VBA
И не должен работать уже потому, что VBA не понимает Option VBASupport. Если писать так, чтобы можно было без преобразований сравнивать, то 

Option Explicit

#If VBA6 = 0 Then
  Option VBASupport 1
#End If

Sub TestRedim5()
  Dim arr1, arr2
  ReDim arr2(0)
  arr1 = arr2
  ReDim arr2(0)
  MsgBox arr1(0)
End Sub



Не выдает ошибку в VBA, выдает вышеуказанную ошибку в LO.

P.S. Не пугайтесь, LO Basic в настоящее время игнорирует операторы условного компилирования. :)
Владимир.

bk

#6
 //уже потому, что VBA не понимает Option VBASupport
Ну разумеется я убрал условие VBASupport для теста в vba. Код, который Вы указали в теме, отличается от представленного сегодня. Первый не работает в vba, второй работает. Так и должно быть, о чем я и написал.