Сообщество программистов Autodesk в СНГ

ADN Club => AutoLisp / VisualLISP и DCL => Тема начата: Балиев от 22-12-2016, 17:30:46

Название: Безопасный массив.
Отправлено: Балиев от 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)
Кто-нибудь знает почему это происходит?
Название: Re: Безопасный массив.
Отправлено: Александр Ривилис от 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)
Название: Re: Безопасный массив.
Отправлено: Балиев от 22-12-2016, 18:11:50
Да, ты прав. Не туда я смотрел...
Спасибо!
Название: Re: Безопасный массив.
Отправлено: Александр Ривилис от 22-12-2016, 18:19:01
Да, ты прав.
As always! :)
Название: Re: Безопасный массив.
Отправлено: Алексей Кулик от 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 закрылся, а там (если я правильно помню) было интересное обсуждение касаемо нижней границы безопасного массива.