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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ошибки лисп интерпретатора 2008+

ошибки лисп интерпретатора 2008+

Ответ
Поиск в этой теме
Непрочитано 15.09.2008, 16:34 #1
ошибки лисп интерпретатора 2008+
Елпанов Евгений
 
программист
 
Москва
Регистрация: 20.12.2005
Сообщений: 1,439

Столкнулся с ошибками в автолиспе под 2008 автокад.
Решил выложить...
пример простого кода:
Код:
[Выделить все]
(setq i 0 l nil)
(repeat	2000
  (setq l (cons (list i (setq i (1+ i))) l))
)
добавит в переменную l список из 2000 под списков с двумя числами в каждом.
Код:
[Выделить все]
(setq mi (apply (function mapcar)(cons (function min)l))) ;; >> '(0 1)
(setq ma (apply (function mapcar)(cons (function max)l))) ;; >> '(1999 2000)
в переменных появятся габариты всего облака точек...
короче, стандартный код, ничего нового, давно изучен и применяется по всему миру...


Код:
[Выделить все]
(setq i 0 l nil)
(repeat	20000
  (setq l (cons (list i (setq i (1+ i))) l))
)
(setq mi (apply (function mapcar)(cons (function min)l)))
возвращает
Код:
[Выделить все]
; warning: unwind skipped on exception
; error: Exception occurred: 0xC0000005 (Access Violation)
; error: Exception occurred: 0xC0000005 (Access Violation)
; error: Exception occurred: 0xC0000005 (Access Violation)
; error: Exception occurred: 0xC0000005 (Access Violation)

Последний раз редактировалось Елпанов Евгений, 15.09.2008 в 17:03. Причина: уточнение
Просмотров: 2690
 
Автор темы   Непрочитано 15.09.2008, 19:33
#2
Елпанов Евгений

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


разбор ошибок, дал вариант их обхода, но это еще не знание...
пример для акада 04:
Код:
[Выделить все]
(progn
  (alloc 65000)
  (expand 1000)
  (setq	i 0
	l nil
  )
  (repeat 25000
    (setq l (cons (list i (setq i (1+ i))) l))
  )
  (gc)
  (alloc 65535)
  (expand 1000)
  (expand 1000)
  (princ
    (setq lst-min-max
	   (list (apply (function mapcar) (cons (function min) l))
		 (apply (function mapcar) (cons (function max) l))
	   )
    )
  )
  (princ)
)
пример для акада 08:
Код:
[Выделить все]
(progn
  (alloc 65000)
  (expand 1000)
  (setq	i 0
	l nil
  )
  (repeat 25000
    (setq l (cons (list i (setq i (1+ i))) l))
  )
  (gc)
  (alloc 65000)
  (expand 1000)
  (princ
    (setq lst-min-max
	   (list (apply (function mapcar) (cons (function min) l))
		 (apply (function mapcar) (cons (function max) l))
	   )
    )
  )
  (princ)
)
Кто может подсказать, как можно точно рассчитывать аргументы для функций 'alloc и 'expand?
Елпанов Евгений вне форума  
 
Непрочитано 16.09.2008, 06:10
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Когда-то, в AutoCAD-10, они были актуальны. Но аргументы, насколько я помню, просто опытным путем подбирались.

Ошибка 0xC0000005 связана с памятью. Причин может быть множество. Иногда проявляется в разных местах, но в другой версии AutoCAD в этом же месте может исчезнуть. Скорее всего связано с непарным созданием/освобождением переменных. Единственное спасение - танцы с бубном.
ShaggyDoc вне форума  
 
Непрочитано 16.09.2008, 08:08
#4
Кулик Алексей aka kpblc
Moderator

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


ДОстаточно тупой вариант "обхода":
Код:
[Выделить все]
(defun test01 (/ i l mi)
  (setq	i 0
	l nil
	) ;_ end of setq
  (repeat 20000
    (setq l (cons (list i (setq i (1+ i))) l))
    ) ;_ end of repeat
  (gc)
  (setq mi (apply (function mapcar) (cons (function min) l)))
  ) ;_ end of defun
Сработал на 2006-м без вопросов
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.09.2008, 10:34
#5
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


Код:
[Выделить все]
(setq mi (apply (function mapcar)(cons (function min)l)))
для списка длинок 20000 на автокад 2005 получаю Exception только первые 6 раз, на седьмой ошибка исчезает. видно к этому времени автокад сам перераспределяет память.
Vov.Ka вне форума  
 
Непрочитано 16.09.2008, 13:25
#6
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Часть ошибок работы с памятью проявляется только в некомпилированых ЛИСПах, особенно это касается длинных списков и рекурсии. В том числе изза этого я стал компилировать любые, даже самые мелкие утилиты.
Alaspher вне форума  
 
Автор темы   Непрочитано 16.09.2008, 14:52
#7
Елпанов Евгений

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


Цитата:
Сообщение от Alaspher Посмотреть сообщение
Часть ошибок работы с памятью проявляется только в некомпилированых ЛИСПах, особенно это касается длинных списков и рекурсии. В том числе изза этого я стал компилировать любые, даже самые мелкие утилиты.
Я тоже так думал, пока не столкнулся со сложной ошибкой - возникала только в скомпилированном файле, при вызове из не скомпилированного - все работало (акад 2008)...
Искал с помощью vl-propagate, т.е. запоминал состояние необходимых переменных вне vlx и после вылета программы, начинал отладку с ними.
Жаль, небыло времени разбираться, в каком именно месте возникает ошибка - но точно ясно, что ее корни в точности, т.е. скомпилированная и не скомпилированная программа, по разному округляют...
Елпанов Евгений вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > ошибки лисп интерпретатора 2008+

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ADT 2006 и 2008 - разное отображение объектов Кулик Алексей aka kpblc Вертикальные решения на базе AutoCAD 31 09.10.2008 21:50
Ошибки в сортаментах (покушение на основы) IBZ Разное 18 02.09.2008 13:03
Лисп для копирования данных нескольких мтекстов по принципу расположения. Red Nova LISP 14 18.06.2008 22:08
не удаляется AutoCAD Architecture 2008 ПалычЪ AutoCAD 4 19.12.2007 09:53