Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

28 Сентябрь 2020, 20:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Ошибка в операторе Redim при Option VBASupport 1  (Прочитано 643 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 163


WWW
« Стартовое сообщение: 11 Август 2020, 17:27 »

Код:
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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 014


iMac, LibreOffice и Apache OpenOffice


« Ответ #1: 11 Август 2020, 18:12 »

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

mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 043


« Ответ #2: 11 Август 2020, 18:23 »

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

С уважением,
Михаил Каганский
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 163


WWW
« Ответ #3: 11 Август 2020, 18:27 »

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

Владимир.
bk
Участник
**
Offline Offline

Сообщений: 30


« Ответ #4: 16 Август 2020, 01:03 »

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

Пол: Мужской
Сообщений: 163


WWW
« Ответ #5: 16 Август 2020, 14:00 »

Этот код не работает и на 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
Участник
**
Offline Offline

Сообщений: 30


« Ответ #6: 16 Август 2020, 19:19 »

 //уже потому, что VBA не понимает Option VBASupport
Ну разумеется я убрал условие VBASupport для теста в vba. Код, который Вы указали в теме, отличается от представленного сегодня. Первый не работает в vba, второй работает. Так и должно быть, о чем я и написал.
« Последнее редактирование: 16 Август 2020, 19:22 от bk » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!