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

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

Удаление элемента списка по номеру

Ответ
Поиск в этой теме
Непрочитано 08.04.2019, 19:55 #1
Удаление элемента списка по номеру
nynokne
 
Регистрация: 17.02.2014
Сообщений: 50

Добрый день.
Есть 2 списка:

(list_X) - список координат
(list_number) - список номеров позиций, которые нужно удалить из списка list_X

Задача удалить из списка list_X все значения с номерами, указанными в списке list_number.

Я пробовал через vl-remove решить задачу, но из-за того, что в списке list_X есть повторяющиеся значения, работает всё некорректно.
Просмотров: 2187
 
Непрочитано 08.04.2019, 20:51
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Без подключения головного мозга, тупо и топорно:
Код:
[Выделить все]
 
(defun tt (lst-to-proceed pos-to-remove / res pos) ;|
(setq l '(0 1 3 2 4 1 0 2 6 8 7 9)
      p '(3 4 6)
      ) ;_ end of setq
(tt l p)
|;
  (setq pos 0)
  (while (< pos (length lst-to-proceed))
    (if (not (member pos pos-to-remove))
      (setq res (cons (nth pos lst-to-proceed) res))
      ) ;_ end of if
    (setq pos (1+ pos))
    ) ;_ end of while
  (reverse res)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.04.2019, 09:52
#3
nynokne


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Без подключения головного мозга, тупо и топорно
Я сделал аналогично для своих списков:
Код:
[Выделить все]
 (setq pos 0)
	(while (< pos (length list_X))
		(if (not (member pos list_number))
			(setq res (cons (nth pos list_X) res))
	          );end if
	        (setq pos (1+ pos))
       );end while

(reverse res)
После выполнения программа возвращает что-то совершенно не то.
Исходный список координат:
(262.36 267.71 268.46 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86)
Список, полученный после (reverse res):
(262.36 262.36 267.71 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86 262.36 267.71 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86 262.36 267.71 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86 262.36 267.71 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86 262.36 267.71 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86 262.36)
Удалить нужно было координату, выделенную красным, что и произошло, но появилось куча одинаковых координат.

----- добавлено через ~8 мин. -----
Код:
[Выделить все]
 (setq pos 0)
(setq res '())
	(while (< pos (length list_X_mLeader))
Вот так заработало, как надо.
nynokne вне форума  
 
Непрочитано 09.04.2019, 11:01
#4
Кулик Алексей aka kpblc
Moderator

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


Я что, просто так оформлял функцию и вносил локальные переменные?
Код:
[Выделить все]
_$ (setq l '(262.36 267.71 268.46 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86)
      p '(2)
      ) ;_ end of setq
(tt l p)
(2)
(262.36 267.71 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86)
_$ l
(262.36 267.71 268.46 268.61 281.11 287.732 299.86 323.61 333.61 343.61 367.36 386.11 398.61 404.86)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.04.2019, 11:49
#5
nynokne


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я что, просто так оформлял функцию и вносил локальные переменные?
Если честно, я не понял, как это работает. Сам код понятен, не ясно, как переменные l и p потом подставляются в программу.
nynokne вне форума  
 
Непрочитано 09.04.2019, 12:03
#6
Кулик Алексей aka kpblc
Moderator

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


Здрасьте! Это же основы - параметры, области видимости...
В качестве затравки: http://autolisp.ru/2011/06/08/functi...bility-region/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Удаление элемента списка по номеру

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходим макрос для элемента списка вырезов (SolidWorks) alex190780 Поиск исполнителей 0 30.03.2016 15:59
Как добавить в свойства имя элемента списка вырезов? alex190780 SolidWorks 3 30.03.2016 13:23
ФАТАЛЬНАЯ ОШИБКА: Unhandled Access Violation Reading 0x0000 Exception at 3d4a0045h AutoCAD 2011русский Nikolays AutoCAD 13 13.10.2015 14:57
Как удалить тип линии Tolyanovich AutoCAD 48 20.11.2014 09:24
Удаление британских масштабов из списка Yuzer AutoCAD 22 03.10.2011 09:28