|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как создать изменяемое имя переменной.
Регистрация: 30.05.2014
Сообщений: 20
|
||
Просмотров: 9984
|
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Формально в автолиспе такое можно сделать - но я даже не буду говорить как, ибо даю 100% гарантию, что Вы пытаетесь что-то простое сделать через **** неправильно. Какова общая задача.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 30.05.2014
Сообщений: 20
|
Задача заключается в следующем. Написаная мной програма считает стоимость спроектированной столешницы из искуственного камня исходя из площади изделия(например для кухни). Но само изделие может иметь несколько вырезов (под мойку или варочную поверхность или еще под што либо. Необходимо отрисовывать каждый вырез и присваевать ему имя (как описано выше) дальше определяем площади каждого выреза по очеред и вычитаем их площади из общей площади изделия. В итоге окончательно получаем итоговую площадь изделия и стоимость его.
|
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
И зачем тебе городить переменные с разными именами. Заноси в ассоциативный список например - '((название площадь координата ...)).
Попробуй сам понять для чего тебе в данной задачи такая сущность как имя переменной да еще и однотипное (element_1,.._2...) - в них нет никакого смысла.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Прости друг - но по моему это не самые твои плодородные годы - т.к. массивов в автолиспе нет (есть vla представления массива с которым он кое-как умеет работать). Я не знаю что тебе больше подойдет в твоей задаче, но как один из вариантов - это ассоциативный список - то есть список списков, у которого каждый элемент начинается с "ключа"), в твоем случае это может быть например имя "отверстия", либо какое-либо другое уникальное ключевое свойство. Для работы с ними предусмотрены функции assoc и subst + стандартные вещи для работы с обычными списками.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
После приобретения навыков работы с ассоциативным списком можно обратить внимание на Расширенные данные + LDATA. Расширенные данные позволяют с помощью функции ssget быстро выбрать нужные примитивы. Возможно, не нужен даже ассоциативный список (так как площадь - это свойсто, но нужно будет разобраться что такое набор. Почитать и попробовать можно здесь с #27 по #41
Цитата:
Вычесленные значения хранятся в соотвествующих переменных AREA и PERIMETER. Получение сведений о площади и свойствах массы
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
инженер-проектировщик КИПиА Регистрация: 30.08.2008
Минск
Сообщений: 159
|
... нет, но почему то же человек выбрал именно такой путь решения ....
![]() что то вроде (setq i -1) (while (< n 10) (setq (read (strcat "element" (itoa (setq n (1+ n))))) (entlast)) ) интересно, а как такой человек чай, например, заваривает... |
|||
![]() |
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
перед циклом создаем пустой список: (setq spisok nil) В цикле пополняем список: (setq spisok(append spisok(list(entlast)))) После цикла извлекаем 5-й элемент списка: (nth 4 spisok) 4 потому, что счет с нуля, т.е. первый элемент: (nth 0 spisok) , другие номера аналогично. Последний раз редактировалось 480725, 19.06.2014 в 01:49. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Это первая конструкция за которую надо оторвать руки лишить доступа к компьютеру.
За эту можно вначале попросить пояснить почему в качестве индексации элемента списка выбран его порядковый номер, затем скорее всего опять-таки, лишить доступа до сдачи экзамена по теоретической части.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
М.б., типа, "название площадь координата-1" .. "название площадь координата-N", или запрашивать в диалоге как подписать очередной (entlast)? Человек обратился с вопросом. Скорее всего он просто некорректно поставлен и его бы устроило создание набора данных и извлечение из него примитивов по номеру. И первоначальная формулировка вопроса, и буквальный ответа, который прислал kakt00z подталкивают к тому, чтобы советовать работу со списком (в конкретной задаче набор данных лучше, но список универсальнее), Ассоциативный список автор вопроса не понимает, а сами списки ему вроде знакомы, хоть он и называет их массивом. Так в данном случае ни в каком ассоциативном списке и нет никакой нужды ни по сути, ни методически, т.к. речь идет только о помощи человеку максимально просто решить поставленную им задачу. По поводу комментариев к чужим сообщениям - вы просто, похоже, переутомились стучать своим молотком, за все посещения форума мне еще ни разу не попадались столь откровенные проявления, мягко говоря, неуважения как в ваших 2 последних сообщениях в этой теме. Или в Питере сейчас это принято? Среди Продуманов? |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Это чем-же я Вас так "откровенно неуважаю"? Вы даете совет человеку в виде кода который 1 - просто не будет работать - да да Ваша конструкция (setq spisok(append spisok(entlast))) просто не "переварит" транслятор автолиспа если есть хоть 1 примитив в чертеже, 2 - является "алгоритмичиеским некоректным" т.к. даже в исправленном виде использоовать для добавления одного элемента append, да еще и в цикле логарифмически увеличивает время выполнения, ну и по мелочи - учите использовать список как массив (nth для справки будет cdr'ить список до обнуления аргумента индекса), (setq spisok nil), (nth 0 spisok) - это тоже показатель "уровня". И как Вы считаете надо коментировать если во всех примерах приведенных Вами содержатся либо синтаксические, либо алгоритмические ошибки. По предыдущему посту, да я действительно считаю, что три года изучения автолиспа прошли в очень "сыром" виде, о чем собственно и пишет сам автор, Вас насколько я помню, даже заинтересовало как он чай заваривает - я при этом не сомневаюсь - что "с чаем" у него все в порядке - но Вы в отличие от автора, который спрашивает как сделать правильно, пишите делаете так, при том даже не удосужившись проверить будет-ли оно работать, не говоря уже о том, что предложенным Вами вариант мягко говоря спорен и в моем личном понимании не далеко ушел от создания "кучки однотипноназванных" переменных.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
То что код работать не будет я увидел, а вот эти "перлы" проглядел:
![]() 480725, рано пытаешься советы давать другим по программированию на лиспе. Ну а уж если так невтерпеж, то будь готов к такой критике. Она еще довольно мягкая, уж поверь ![]()
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic) Последний раз редактировалось Do$, 20.06.2014 в 09:14. |
||||
![]() |
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
Остальные рассуждения в цитируемом тексте прокомментирую на этот раз протестированным текстом программы. Цикл 9999 повторений занял ~ 7 секунд и создал список из 9999 элементов. В теме речь идет об отверстиях в столешнице (см. #4). Обычно их 2 - мойка и плита. В вопросе не формулируется необходимость разделять отверстия по назначению, но даже если бы такая необходимость существовала - никакого смысла в ассоциативном списке все равно не было бы т.к. никакой потребности раздельно извлекать "отверстие под мойку-N" т.е. отдельно нумеровать отверстия по назначению - из описания задачи не возникает. А если не ставить N -потеряется ассоциативность. Привожу текст из файла, т.е. прошедший проверку (вместо отверстий строил отрезок): (setQ spisok nil) (Repeat 9999 (command "_Line" (list 0 0)(list 1 1)"") (setQ spisok(appenD spisok(list (entlast)))) );repeat (Princ (strcat"\nL="(itoa(length spisok)))); это проверка на предмет логарифмического увеличения (Princ (nth 9998 spisok)) (prin1) Результат (скопирован из текстового окна Автокада): L=9999<Имя объекта: 7e55cad8> PS Не смог найти в GOOGLE никаких данных про Логарифмическое увеличение - звучит красиво, но непонятно.. Разъясните, пожалуйста, заодно и и как все-таки nth будет cdr'ить список до обнуления аргумента индекса, а то я пользуюсь этим оператором лет 10, значит немеренноее число списков заcdr'ил - их ведь надо будет как-то расcdr'ивать... Последний раз редактировалось 480725, 19.06.2014 в 03:00. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
Список, в отличие от массива, состоит из двух частей (если он не пустой) головы (то что мы получаем функцией car) и хвоста(cdr) - все. Весь остальной доступ формируется через эти функции. То есть когда Вы задаете (nth x ...) функция cdr'ит список x раз - поэтому в лиспе доступ по индексу практически не используеться в виду неэффективности (максимум '(X Y Z) координаты, причем прошу не путать индекс с порядком - то есть что за чем следует) - структуры формируются по иным правилам - в зависимости от задачи, но в любом случае подразумеваеться "однократная" пробежка по списку для формирования результата. Про append - логику функции append на лиспе можно выразить так (внутри лиспа на c++ написанно, алгоритмически то-же самое т.к. структура та-же): Код:
з.ы. то что за 10 лет пользования вы теорию даже не открывали - это очень грустно...
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Регистрация: 06.10.2007
Москва
Сообщений: 132
|
Цитата:
1) Хотелось бы знать, идет ли здесь речь об С++, Лиспе вообще или именно об Автолиспе, и являются ли изреченные здесь гипотезы плодом личных размышлений, или почерпнуты из каких-то официальных источников именно по Автолиспу. 2) Хотелось бы, что гораздо проще, проверить приведенную в цитате теорию на практике. (В этом вопросе наш спор хорошо иллюстрирует ссылка: http://ru.wikisource.org/wiki/%D0%94...D0%B8%D0%BD%29) Текст программы приводить не стану, просто повторяю ранее написанный набор команд, получаю 9999 линий, а затем второй программой в цикле выполняю 9999 раз (command"_erase"(nth(setq number(1+ number))spisok)"") - и линий больше нет И этот цикл работает более чем в 10 раз быстрее чем первоначально опубликованный, т.е менее секунды. То ли чтение из списка идет быстрее запиcи, то ли команда _Erase быстрее команды _Line. Мне, собственно это по барабану. Реальные списки у меня до 10000 элементов не дотягивают, время обработки списков ни меня ни пользователей не напрягало никогда. (Наборы данных - другая песня, если надо анализировать буквально все примитивы в чертеже, например при обработке планов здания выполненных в Архикаде - тут доходило до 15 минут и приходилось писать на экране процент выполненного) И последнее. Я второй раз подкрепляю свою точку зрения экспериментом на 9999 повторений. Хотелось бы узнать сколько времени займет извлечение 9999 значений из ассоциативного списка, и как его формировать в Автолиспе без append, не приведенной же в последнем сообщении функцией. Хотя бы для тех-же линий. Я думаю, эту дискуссию надо на форуме заканчивать, через личку можно провести сравнение именно по времени, время для описанной в теме задачи не критично. Про логарифмическое увеличение посмотрите ссылку: https://www.google.ru/?gfe_rd=cr&ei=...B0%D0%B5%D1%82 если в поиск добавить время выполнения то результаты будут только более засоренными. Я попробую про это в личку написать, вдруг опять не догадаетесь... |
|||
![]() |
|
||||
Вместо ввода кучи букв уже давно самостоятельно проверил бы.
Для начала вот это в своем коде Код:
Код:
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic) |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как правильно создать расчетную схему фундамента мельницы в Лире? | tanaka | Лира / Лира-САПР | 15 | 27.02.2013 05:45 |
SolidWorks 2009 x64 SP4 значение переменной в заметке - как? Перенос переменной из детали в сборку - как? | sommer78 | SolidWorks | 6 | 13.09.2012 13:00 |
LISP - как переменной присвоить бесконечно большое значение?(не поверите, такое возможно) | cj_lex | LISP | 7 | 23.03.2012 20:25 |
Как в SCAD создать группу нагружений из загружений? | МишаИнженер | SCAD | 1 | 21.08.2011 05:30 |
Перевод имени блока в имя переменной и обратно | Supermax | Программирование | 11 | 14.12.2009 23:26 |