| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как написать функцию, которая возвращает неск. результатов?

Как написать функцию, которая возвращает неск. результатов?

Ответ
Поиск в этой теме
Непрочитано 13.01.2006, 15:59 #1
Как написать функцию, которая возвращает неск. результатов?
kp+
 
идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090

Как написать функцию, которая возвращает несколько результатов, без использования глобальных переменных?

Эта фишка как-то организована в функции VLA-GetBoundingBox, но как - я не догнал.

Подскажите, PLS.
Просмотров: 4242
 
Непрочитано 13.01.2006, 16:06
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


А почему бы не возвращать список (хоть точечных пар) и потом его анализировать уже где угодно и как угодно?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2006, 16:11
#3
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


В VLA-GetBoundingBox используются глобальные переменные,
названия которых ты передаешь.
Елпанов Евгений вне форума  
 
Непрочитано 13.01.2006, 16:18
#4
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Код:
[Выделить все]
(defun test (p1 p2)
  (set p1 "Первая переменная")
  (set p2 "Вторая переменная"))
;Проверка
(test 'a1 'a2)
Елпанов Евгений вне форума  
 
Непрочитано 13.01.2006, 16:19
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Если провернуть
Код:
[Выделить все]
(defun test (/ ent minp maxp)
  (if (setq ent (entsel))
    (vla-getboundingbox (vlax-ename->vla-object (car ent)) 'minp 'maxp)
    ) ;_ end of if
  ) ;_ end of defun
то попытка обратиться в minp или maxp вне функции вернет nil. Или это не полностью глобальные переменые?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2006, 16:23
#6
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


>kpblc
Так ты их сам сделал локальными, попробуй
Код:
[Выделить все]
(defun test (/ ent)
  (if (setq ent (entsel))
    (vla-getboundingbox (vlax-ename->vla-object (car ent)) 'minp 'maxp)
  ) ;_  if
 ;_ end of if
)
Елпанов Евгений вне форума  
 
Непрочитано 13.01.2006, 16:30
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Ну это понятно. Я-то думал, что идет работа нечто типа (vl-bb-*)... Т.е. объявляй, не объявляй переменные локальными, а они все равно доступны. Ошибка вышла, вот о чем молчит наука
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2006, 17:04
#8
Эдуард

строительство
 
Регистрация: 16.01.2004
Петербург
Сообщений: 165
<phrase 1=


Код:
[Выделить все]
(defun test (/ ent minp maxp)
  (if (setq ent (entsel))
    (progn
      (setq s (vla-getboundingbox
		(vlax-ename->vla-object (car ent))
		'minp
		'maxp
	      )
      )
      (setq minpt (vlax-safearray->list minp)
	    maxpt (vlax-safearray->list maxp)
      )
    )
  ) ;_ end of if 
) ;_ end of defun
Эдуард вне форума  
 
Автор темы   Непрочитано 13.01.2006, 17:15
#9
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,090


Цитата:
Сообщение от kpblc
А почему бы не возвращать список (хоть точечных пар) и потом его анализировать уже где угодно и как угодно?
Видимо, так и придется делать.
Просто если функция возвращает несколько отдельных результатов, получается нагляднее.
Так сделано, например, в ПАСКАЛе. Там в описаниях процедур и функций можно указать, какие переменные надо изменить в результате (хоть глобальные, хоть локальные той конструкции, откуда делается вызов).
А так надо сначала клеить все в список, а потом раздергивать его на нужные части
kp+ вне форума  
 
Непрочитано 14.01.2006, 02:00
#10
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Цитата:
Просто если функция возвращает несколько отдельных результатов, получается нагляднее.
Так сделано, например, в ПАСКАЛе. Там в описаниях процедур и функций можно указать, какие переменные надо изменить в результате (хоть глобальные, хоть локальные той конструкции, откуда делается вызов).
А так надо сначала клеить все в список, а потом раздергивать его на нужные части Sad
Ну не всё так плохо

1) Можно к примеру формировать лисп выражения в виде строк и потом вычислять их к примеру такой функцией:
Код:
[Выделить все]
(defun asmi-EvalListOfStrings(StringList)
  (eval
    (read
      (apply 'strcat StringList)))
  ); end of asmi-EvalListOfStrings
Что это даёт? Да то что можно передавать любые выражения, в том числе нужные в данный момент названия переменных в виде строк:
Код:
[Выделить все]
(defun Test(Variable Digit)
  (asmi-EvalListOfStrings
    (list "(setq " Variable " "
	  (vl-princ-to-string Digit) ")"
	); end list
    ); end asmi-EvalListOfStrings
  ); end of c:Test
Код:
[Выделить все]
Command: (Test "Var1" 17)
17

Command: !var1
17

Command: (Test "Var2" 22.5)
22.5

Command: !var2
22.5
Если данные переменные являются в вызывающей функции локальными, то таковыми они и останутся. Для вышерассмотренного случая вполне можно написать функцию типа:

(defun kp+GetBoundingVars(Object minVar maxVar)

И она вернет в вызывающую функцию нужные пременные.


2) А чем не подходя т ассоциативные списки? Пишем функцию типа такой:
Код:
[Выделить все]
(defun asmi-GetAssocValue(Tag Lst)
  (cadr(assoc Tag Lst))
  ); end of asmi-GetAssocValue
Создаём список где всё называем своими именами (или цифрами):
Код:
[Выделить все]
(setq a '(("MaxPt" '(3.5 6.8))("MinPt" '(1.5 3.2))(8 "Karamba!!")))
А затем обращаемся к списку по именам:
Код:
[Выделить все]
Command: (asmi-GetAssocValue "MaxPt" a)
(QUOTE (3.5 6.8))

Command: (asmi-GetAssocValue "MinPt" a)
(QUOTE (1.5 3.2))

Command: (asmi-GetAssocValue 8 a)
"Karamba!!"
Не горюй, пиши библиотечные функции
{Smirnoff} вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как написать функцию, которая возвращает неск. результатов?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск