Безопасный массив.

Автор Тема: Безопасный массив.  (Прочитано 7742 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн БалиевАвтор темы

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Безопасный массив.
« : 22-12-2016, 17:30:46 »
Здравствуйте,

Мне нужно создавать безопасный массив переменного размера. Выяснилось, что при создании массива второй аргумент (точечная пара) не воспринимается в параметрическом виде. При этом, если использовать для создания точечной пары функцию (cons 0  p), где p - параметр, то массив создается, но при попытке его заполнения выскакивает ошибка: "; ошибка: сбой функции vlax-safearray-fill.  Неверный список инициализации. #<safearray...>".

Т.е. такая запись работает:
Код - Auto/Visual Lisp [Выбрать]
  1. (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble (cons 0 50)) pointsArray)
А такая - нет:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq p 50)
  2. (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble (cons 0 p)) pointsArray)
Кто-нибудь знает почему это происходит?

Отмечено как Решение Балиев 22-12-2016, 18:12:08

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Безопасный массив.
« Ответ #1 : 22-12-2016, 17:56:43 »
Command: (setq p 4) 4
Command: (setq dd (vlax-make-safearray vlax-vbDouble (cons 0 p))) #<safearray...>
Command: (setq ee (vlax-safearray-fill dd '(1.0 2.0 3.0 4.0 5.0))) #<safearray...>

Что не так? Может у тебя количество элементов в массиве неправильное?

Command: (setq ee (vlax-safearray-fill dd '(1.0 2.0 3.0 4.0 5.0 6.0))) ; error:
vlax-safearray-fill failed.  Invalid initialization list. #<safearray...> (1.0
2.0 3.0 4.0 5.0 6.0)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн БалиевАвтор темы

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Re: Безопасный массив.
« Ответ #2 : 22-12-2016, 18:11:50 »
Да, ты прав. Не туда я смотрел...
Спасибо!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Безопасный массив.
« Ответ #3 : 22-12-2016, 18:19:01 »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1116
  • Карма: 173
Re: Безопасный массив.
« Ответ #4 : 23-12-2016, 00:21:13 »
Пишу с телефона, поэтому минимум форматирования :)
Давненько уже принял за правило нечто типа:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq lst '(1 2 3 ... n))
  2. (setq safe (vlax-make-safearray vlax-vbdouble (cons 0 (1- (length lst))))) ;; Основной момент
  3. (setq safe-fill (vlax-safearray-fill safe lst))
  4. (setq var (vlax-make-variant safe-fill))
Прошу прощения за отвратительный вариант форматирования. Код написан только в качестве примера, в реальной жизни такого количества присвоений, конечно, нет.
P.S. К сожалению, форум на arcada.com.ua закрылся, а там (если я правильно помню) было интересное обсуждение касаемо нижней границы безопасного массива.
« Последнее редактирование: 23-12-2016, 00:49:12 от Александр Ривилис »
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!