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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему функция выдает ошибку при повторном (многократном) вызове? А иногда просто выдает.

Почему функция выдает ошибку при повторном (многократном) вызове? А иногда просто выдает.

Ответ
Поиск в этой теме
Непрочитано 09.06.2018, 19:44 #1
Почему функция выдает ошибку при повторном (многократном) вызове? А иногда просто выдает.
oleg_marshinov
 
Регистрация: 27.01.2009
Сообщений: 31

Код:
[Выделить все]
 (VL-LOAD-COM)
;;;функция возврата меньшего из сортированного
(defun blij1 (spis333 a)
(cond ((AND (< (CAR spis333) A) (> (CADR spis333) A)) (CAR spis333))
((LISTP spis333) (blij1 (CDR spis333) A))
	(t nil)) 
)

;;;функция сортировки и нахождения ближайшего

(defun blij ( spis22 a / spis blij223 blij22)
(setq spis (VL-SORT spis22 '<));(-8 -3 0 1 4 7 9)
(cond ((MEMBER a spis) (car (MEMBER a spis)))
       ((AND (< (CAR SPIS) A) (> (CAR (REVERSE  SPIS)) A)) 
       (progn
			  (SETQ blij22 (blij1 SPIS A))
			(SETQ blij223 (list blij22  (cadr (MEMBER blij22  SPIS) )))
			  (if (< (- a (car blij223)) (-  (cadr blij223) a))
			    (  (car blij223))
			    (  (cadr blij223))
			    )
	))
	 ((> (CAR SPIS) A) (CAR SPIS))
	 ((< (CAR (REVERSE  SPIS)) A) (CAR (REVERSE  SPIS)))
 ))


  (print (blij (list 3 4 7 9 -3 0 -8) -20))
  (print (blij (list 3 4 7 9 -3 0 -8) 0))
  (print (blij (list 3 4 7 9 -3 0 -8) 5))
  (print (blij (list 3 4 7 9 -3 0 -8) 11))

Последний раз редактировалось Кулик Алексей aka kpblc, 09.06.2018 в 20:22.
Просмотров: 1784
 
Непрочитано 09.06.2018, 22:17
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
 (defun near (value lst)
  ;|
_$ (near -20 '(3 4 7 9 -3 0 -8))
-8
_$ (near 0 '(3 4 7 9 -3 0 -8))
0
_$ (near 5 '(3 4 7 9 -3 0 -8))
4
_$ (near 11 '(3 4 7 9 -3 0 -8))
9
|;
  (car (vl-sort lst (function (lambda (a b) (< (abs (- value a)) (abs (- value b)))))))
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 09.06.2018, 23:06
#3
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Код:
[Выделить все]
 
(defun blij (s_list f_number)
    (cadr (member f_number (vl-sort (append s_list (list f_number)) (if (< f_number 0) '< '>))))
)
koMon вне форума  
 
Автор темы   Непрочитано 09.06.2018, 23:18
#4
oleg_marshinov


 
Регистрация: 27.01.2009
Сообщений: 31


Спасибо, Алексей. Так конечно логичнее. Но все таки почему в данном конкретном случае вылетает ошибка
oleg_marshinov вне форума  
 
Непрочитано 09.06.2018, 23:23
#5
Кулик Алексей aka kpblc
Moderator

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


А бог его знает. Может быть, ты упираешься в ограничение рекурсий в ACAD, может, еще что. Мне проще написать работающий код, чем разбираться в причинах глюков
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.06.2018, 23:56
#6
oleg_marshinov


 
Регистрация: 27.01.2009
Сообщений: 31


KOMON не совсем та задача стояла, от 6 должно было 7 найти
oleg_marshinov вне форума  
 
Непрочитано 10.06.2018, 22:11
#7
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от oleg_marshinov Посмотреть сообщение
KOMON не совсем та задача стояла, от 6 должно было 7 найти
согласен, находился минимальный сосед в сортированном списке с добавленным числом поиска.
можно внести коррекцию:
Код:
[Выделить все]
 
(defun blij (s_list f_number / m_list r_number l_number)
  (setq m_list(vl-sort (append s_list (list f_number)) '<))
  (if (< (abs (- (abs f_number) (abs (if (null (setq r_number (cadr (member f_number m_list)))) 0 r_number))))
         (abs (- (abs f_number) (abs (if (null (setq l_number (cadr (member f_number (reverse m_list))))) 0 l_number))))
      )
      	 r_number
    	 l_number
  )
)
но вот, что должно быть на выходе, если список будет содержать два ближних соседа, как например в списке (blij (list 3 4 5 6 7 9 -3 0 -8 -12 -21) 6)?

Код:
[Выделить все]
 
(defun blij (s_list f_number / m_list r_number l_number test_r test_l)
  (setq m_list(vl-sort (append s_list (list f_number)) '<)
	test_r (abs (- (abs f_number) (abs (if (null (setq r_number (cadr (member f_number m_list)))) 0 r_number))))
        test_l (abs (- (abs f_number) (abs (if (null (setq l_number (cadr (member f_number (reverse m_list))))) 0 l_number))))
  )
  (cond
    	(
	   (< test_l test_r)
	 	l_number
	)
	(
	   (> test_l test_r)
	 	r_number
	)
	(
	   (= test_l test_r)
	 	(list l_number r_number)
	)
   )
)

Последний раз редактировалось koMon, 10.06.2018 в 22:35.
koMon вне форума  
 
Автор темы   Непрочитано 11.06.2018, 22:42
#8
oleg_marshinov


 
Регистрация: 27.01.2009
Сообщений: 31


Мне эта функция была нужна для конкретного рабочего случая в нём не может быть одинаковых расстояний

----- добавлено через ~2 ч. -----
Немного доработал для работы по двум координатам функцию Алексея, может пригодится кому
Код:
[Выделить все]
 (defun near2 (value lst)
   (car (vl-sort lst (function (lambda (a b) (< (+ (abs (- (car value) (car a))) (abs (- (cadr value) (cadr a))))
					        (+ (abs (- (car value) (car b))) (abs (- (cadr value) (cadr b)))))))))
  ) ;_ end of defun    (near2 '(34 43) '((0 0) (13 24)(40 40)(50 50)(65 20)))

Последний раз редактировалось oleg_marshinov, 12.06.2018 в 02:35.
oleg_marshinov вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему функция выдает ошибку при повторном (многократном) вызове? А иногда просто выдает.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При вызове options autocad выдаёт фатальную ошибку DIM2 AutoCAD 12 24.05.2015 21:16
Файл выдает ошибку при расчете. Nekromanser Лира / Лира-САПР 9 08.12.2011 14:56
при запуске выдает ошибку "acui18res.dll not found" max_2701 AutoCAD 1 17.10.2010 10:51
Autocad 2008 выдает ошибку !dbobji.cpp@313 Gadick AutoCAD 1 20.08.2010 13:48
Почему в AutoCAD шрифт ГОТС А иногда не редактируется Марина_D AutoCAD 4 22.04.2010 05:37