Ошибка неверный тип аргумента fixnump nil

Перейти к содержимому раздела

Форумы CADUser

Информационный портал для профессионалов в области САПР

Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.

Дерево сообщений Активные темы Темы без ответов

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

#1 20 ноября 2008г. 17:29:21

  • Vidocq
  • Активный участник
  • На форуме с 28 сентября 2008г.
  • Сообщений: 100
  • Спасибо: 0

Тема: неверный тип аргумента: fixnump: nil

Всем привет!
Столкнулся с такой вот странной ошибкой.
Странность выражается следующим образом:
Написал прогу на Лиспе — нормально запустилась и работала как надо. После того как ее немного изменил появилась данная ошибка (может где с кодом ошибся). Но проблема не этом.
Откатился к прежнему коду (работавшему) — запускаю и получаю эту же ошибку!?
Перезапуск Автокада не помог. Старая программа заработала только на следующий день (т.е. после перезагрузки компа).
И так по-кругу.
А на другом компе (там 2009 Акад стоит) после появления данной ошибки — даже после перезагрузки старый код не заработал.
Что за косяк такой и как с ним бороться?
Спасибо.

#2 Ответ от Александр Ривилис 20 ноября 2008г. 23:36:56

  • Александр Ривилис
  • Александр Ривилис
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 15 апреля 2005г.
  • Сообщений: 8,661
  • Спасибо: 158

Re: неверный тип аргумента: fixnump: nil

«Косяк» в программе. Дело в том что ты в каком то месте программы считаешь что у тебя значение переменной целое (INT), а в действительности она не инициализированна (т.е. nil).

Сообщения 2

Тему читают:

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться


@jeffrV7ZMK wrote:

…. the program works fine while testing against string. …. 


If it has worked fine, I assume that (c:….) command must be returning an integer, because [using 12 arbitrarily here]:

(= (type 12) string)
nil
(= (type 12) ‘str)
nil
(= (type «12») string)
nil
(= (type «12») ‘str)
T

The first one is probably equivalent to what you were getting, even without the correct Type designation, and since that just returns nil, it went ahead with the ‘else’ expression and made a string from the integer, just as it would with the correct Type designation [the second one].

If it were working with a string returned by (c:….) [the 3rd and 4th ones], you should have gotten the equivalent of the third one, in which case it would also have tried to make a string out of an integer, but you should have gotten an error about the string «12» not being an integer.

Kent Cooper, AIA

Когда Вы начнёте писать свои программы, то неизбежно столкнетесь с необходимостью решения проблем, которые в программировании носят название отладка программы.

Давайте рассмотрим некоторые технические приемы, которые помогут нам при создании новых программ на языке AutoLISP. К таким приемам относятся:

  • Проверка фрагментов кода в окне «КонсольVisual LISP».
  • Отслеживание парных кавычек.
  • Поиск парных скобок в процессе и после написания кода.
  • Использование окна «Контрольное значение»

Проверка фрагментов кода в окне «КонсольVisual LISP».

Вы можете проверить, насколько правильно вы понимаете синтаксис функции.

Давайте для примера рассмотрим функцию getpoint. Функция  getpoint  помогает нам задать координаты точки при помощи мыши. Давайте поищем эту функцию в справочной системе. Система выдаст следующую информацию. См. Рис. 1.

Отладка программы

Рис. 1. «Окно справка»

 Мы видим, что функция getpoint  имеет два аргумента.

Первый, из которых pt – это координаты точки.

А второй msg — текст, который будет показан пользователю.

При чем оба аргумента не являются обязательными. Это следует из того, что они заключены в квадратные скобки ( [pt] [msg] )

Давайте откроем окно «КонсольVisual LISP» щелкнув по одноименной кнопке. См. Рис. 2.

Отладка программы

Рис. 2.     Добавляем  (getpoint)

Введем функцию (getpoint) без аргументов и нажмем <Enter>.

Активным станем AutoCAD, где надо указать любую точку.

После указания точки, AutoCAD снова вернет нас в редактор Visual LISP.

В консоли появятся координаты указанной точки. См. Рис. 3.

Отладка программы

Рис. 3. Координаты указанной точки.

Теперь давайте попробуем использовать аргументы. Введем функцию с первым аргументом (getpoint pt) и нажмем <Enter>. См. Рис. 4.

Отладка программы

Рис. 4.  Ошибка:  не верный тип аргумента

Консоль выдаст нам сообщение об ошибке: неверный тип аргумента: point: nil.

Очевидно, переменная pt не содержит в себе значения. (значение nil означает, что аргумент не имеет значения). Давайте это проверим. Наберем в следующей строке pt и нажмем <Enter>. См. Рис. 5.

Отладка программы

Рис. 5.    Проверка значения переменной pt.

Консоль подтвердит наши предположения.

Давайте подставим, вместо pt координаты точки начало координат (getpoint (0 0 0)) и нажмем <Enter>. См. Рис. 6.

Отладка программы

Рис. 6.     Ошибка: неверная функция.

Консоль выдает сообщения об ошибке: неверная функция : 0. Скорее всего, координаты в скобках Visual LISP принял за функцию с именем 0 (вспоминаем, что после открывающийся скобки всегда следует имя функции). Как объяснить Visual LISP, что это не функция, а список координат? Для этого есть, два способа:

1)      После открывающийся скобки добавить функцию list(list 0 0 0)

2)      Или перед открывающийся скобкой поставить апостроф: (0 0 0)

Давайте снова напишем функцию, но уже с апострофом (getpoint (0 0 0)) и нажимаем <Enter>. См. Рис. 7.

Отладка программы

Рис. 7.    Добавляем (getpoint (0 0 0)).

Функция сделает активным AutoCAD и мы увидим, что указатель мыши как будто привязан ниточкой к началу координат. См. Рис. 8.

Отладка программы

Рис. 8.   Точка задается относительно другой точки.

И теперь мы можем задать точку, относительно другой точки, координаты которой являются первым аргументом функции getpoint. Щелкните в любом месте, и консоль вернет координаты выбранной точки. См. Рис. 9.

Отладка программы

Рис. 9. Координаты указанной точки.

Давайте теперь разберемся со вторым аргументом. Напомню, что это msg — текст, который будет показан пользователю. Поскольку это текст (string), то писать его нужно в кавычках. Давайте добавим к нашей функции надпись: “Проверка”. См. Рис. 10.

Отладка программы

Рис.. 10.    Добавляем (getpoint(0 0 0) «Проверка»)

Нажимаем <Enter>. И видим, что наша надпись появилась в командной строке. См. Рис. 11.

Отладка программы

Рис. 11. Надпись в командной строке.

Очевидно, что второй аргумент функции getpoint, выдает подсказку пользователю, что в данный момент ему нужно сделать.

Давайте посмотрим пример применения этой функции в программе my_otr, которую я приводил в уроке: Построение отрезков в AutoCAD.

Открываем эту программу, выделяем вторую и третью строки и нажимаем на кнопку «Загрузить выделенный фрагмент». См. Рис. 12.

Отладка программы

Рис. 12. Загрузка выделенного фрагмента.

Далее на просьбу в командной строке, выбираем первую точку (координаты этой точки при помощи функции присвоения setq запоминают в переменной р1). Появится следующая просьба. Вторую точку мы уже выбираем, ориентируясь на первую.

После указания второй точки в окне консоли появятся координаты выбранных точек. См. Рис. 13.

Отладка программы

Рис. 13.     Координаты выбранных точек.

Таким образом, мы проверили, как у нас работает выделенный фрагмент программы.

Я думаю, что после такова исследования, мы уже имеем четкое представление о том, как работает эта функция.

Отслеживание парных кавычек.

Раньше при написании кода в других текстовых редакторах одной из наиболее частых ошибок было не соблюдение правильного количества скобок и кавычек. Напомню, что количество открывающихся скобок и кавычек должно равняться количеству закрывающихся. В других текстовых редакторах отследить это было не всегда легко.

В 2000 году с появлением Visual LISP этот процесс стал значительно более простым.

Давайте начнем с простого и рассмотрим двойные кавычки. В Visual LISP применяется кодирование цветом, поэтому любая строка, заключенная в кавычки, на экране пурпурная. Кодирование цветом применяется в процессе ввода, поэтому после того, как вы поставили открывающиеся кавычки, остальная часть файла становится пурпурной до тех пор, пока вы не введете закрывающиеся кавычки. См. Рис. 14.

Отладка программы

Рис. 14.    Не закрытые кавычки.

Ставим в нужном месте закрывающиеся кавычки, и пурпурным сделается только текст, заключенный в кавычки с двух сторон. См. Рис. 15.

Отладка программы

Рис. 15.   Кавычки с двух сторон.

Стоит отметить, что в программах AutoLISP нужно всегда использовать кавычки вида “ ” (кавычки « » — не воспринимаются)

Поиск парных скобок в процессе и после написания кода.

С парными скобками все немного сложнее. Но в редакторе Visual LISP есть инструменты, которые помогают нам избежать лишних или недостающих скобок.

Прыгающий курсор.

Как только, в процессе написания кода новой программы, вы ставите закрывающую скобку, ваш курсор перескакивает к соответствующей ей открывающей. Если курсор не перескакивает, значит, вы поставили слишком много закрывающихся скобок (нет открывающийся скобки, к которой курсор мог бы переместиться). Если программа короткая, следить за перемещением курсора не сложно. В длинных программах следить за курсором сложнее, потому что в некоторых случаях открывающая скобка может находиться в не видимой области текущего окна.

Двойной щелчок возле скобок.

В редакторе Visual LISP проблема отслеживания перемещений курсора решена при помощи подсветки (выделения). Поместите курсор непосредственно перед  открывающейся скобкой или после закрывающейся и щелкните дважды левой кнопкой мыши. Все содержимое скобок станет подсвеченным. Теперь вы видите, где находится парная скобка. См. Рис. 16.

Отладка программы

Рис. 16.   Выделение содержимого скобок.

Если кавычки и скобки в вашей программе расставлены правильно, но программа все равно не работает, не отчаивайтесь, отнеситесь к поиску ошибок как к интересной задаче.

Для начала определите, как далеко продвинулась ваша программа, прежде чем прекратила работать. Это можно сделать, если проверить значения присвоенные переменным.

Типы переменных.

В программах AutoLISP используются два типа переменных:

1) Системные переменные, которые описаны в AutoCAD (Пример: osmode).

2) Программные переменные, которые описаны и именованы вами.

Программные переменные могут быть как локальными, т. е. сохранять свои значения только на время выполнения программы, так и глобальными, сохраняющими значения после завершения работы программы, в которой они определены.

Когда вы добавляете  в свою программу новую переменную, то по умолчанию она глобальная. Для того, чтобы она стала локальной ее нужно добавить в список временных переменных функции defun. См. Рис. 17.

Отладка программы

Рис. 17.    Список временных переменных.

Окно «Контрольное значение»

Для проверки значения переменных удобнее всего использовать окно «Контрольное значение». Для того, чтобы добавить переменную в это окно, поместите курсор на имени переменной р1 и нажмите на кнопку «Добавить контрольное значение». См. Рис. 18.

Отладка программы

Рис. 18. Добавление переменных в окно «Контрольное значение».

Появится окно «Добавление контрольных значений», в котором нажимаем кнопку «ОК».

Наша переменная появится в окне «Контрольное значение». См. Рис. 19.

Отладка программы

Рис. 19. Окно «Контрольное значение».

Чтобы окно «Добавление контрольных значений» не появлялось, а переменные сразу попадали в окно «Контрольное значение», переменную нужно выделить.

Давайте добавим в это окно и другие переменные.

Когда окно «Контрольное значение» открыто, можно добавлять переменные через кнопку «Добавить контрольное значение» расположенную в этом окне. См. Рис. 20.

Отладка программы

Рис. 20.   Кнопка  «Добавить контрольное значение».

Теперь для того, чтобы увидеть значения переменных, после того как программа прекратила работать, нам необходимо все переменные сделать глобальными. Для этого их нужно убрать из списка временных переменных функции defun.

Затем загрузить нашу программу, нажав на кнопку «Загрузить активное окно редактора». См. Рис. 21.

Отладка программы

Рис. 21.   Загрузка программы.

Далее переходим в AutoCAD, нажав на кнопку «Активизация AutoCAD».

Набираем в командной строке mp_kub. См. Рис. 22.

Отладка программы

Рис. 22.  Вводим в командной строке mp_kub

Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.

Наша программа, которая должна была нарисовать куб. Этого не сделала.

Давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 23.

Отладка программы

Рис. 23. Окно «Контрольное значение»

Мы видим, что переменные р1 и р2 имеют значения, а все остальные переменные нет. Очевидно, что ошибка произошла при расчете переменной р3. Находим эту строчку в программе и видим, что координаты точки р3 рассчитываются относительно самой себя. А должны были рассчитываться относительно точки р2.

Давайте, исправим ошибку, и снова загрузим нашу программу.

Перейдем в AutoCAD, набираем в командной строке mp_kub и нажмем <Enter>.

Указываем базовую точку, и наша программа нарисует куб. См. Рис. 24.

Отладка программы

Рис. 24. Программа нарисовала куб.

Ура заработала!!!

Давайте снова  вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 25.

Отладка программы

Рис. 25.   Все переменные имеют значение.

Мы видим, что все наши переменные имеют значения.

После того, как программа отлажена:

  1. Нужно вернуть все локальные переменные в список временных переменных функции defun.
  2. Сохранить свою LISP-программу.
  3. Закрыть редактор Visual LISP и AutoCAD, чтобы очистить все значения переменных. Этот шаг очень важен. Возможно, что некоторые переменные всё еще сохраняют присвоенные им значения.

Теперь давайте снова запустим  AutoCAD и редактор Visual LISP. Откроем окно «Контрольное значение». Если переменные исчезли, то добавьте их снова. См. Рис. 26.

Отладка программы

Рис. 26.   Все переменные не имеют значений.

Мы видим, что все переменные не имеют значений.

Теперь давайте рассмотрим, как отслеживать значения переменных во время выполнения программы.

Для этого нам необходимо в программе поставить точки останова – места, в которых во время выполнения программа будет останавливаться.

Для этого помещаем курсор в то место программы, где мы хотели бы установить точку останова и нажимаем на кнопку «Точка останова вкл/выкл». См. Рис. 27.

Отладка программы

Рис. 27.   Точка останова.

Точка останова выделится красным.

Давайте добавим еще пару точек останова, загрузим программу и перейдем в AutoCAD. См. Рис. 28.

Отладка программы

Рис. 28.    Добавляем точки останова и загружаем программу.

Набираем в командной строке mp_kub. Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.

AutoCAD вернет нас в редактор Visual LISP, и мы увидим, что наша программа остановилась в первой точки останова. См. Рис. 29.

Отладка программы

Рис. 29.   Первая точка останова.

Обратим внимания на окно «Контрольное значение». В данной точки останова переменная р1 уже имеет текущее значение. Для продолжения программы нажимаем на кнопку «Продолжить». См. Рис. 30.

Отладка программы

Рис. 30.   Следующая точка останова.

Наша программа остановиться в следующей точке останова. В этой точке уже пять переменных будут иметь свои текущие значения.

Снова нажимаем на кнопку «Продолжить». См. Рис. 31.

Отладка программы

Рис. 31.   Последняя точка останова.

Программа остановиться в последней точке останова. В этой точке уже все переменные имеют свои текущие значения.

Для того чтобы завершить выполнение программы, снова нажимаем на кнопку «Продолжить».

В конце программы мы снова окажемся в  AutoCAD, где будет нарисован куб. См. Рис. 32.

Отладка программы

Рис. 32.    Программа нарисовала куб.

Теперь давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 33.

Отладка программы

Рис. 33.     Все переменные не имеют значений.

По окончании программы все переменные снова не имеют значений.

Таким образом, используя точки останова и окно «Контрольное значение», можно отслеживать значения переменных в любой точке во время выполнения программы.

Чтобы удалить все точки останова по окончании работы с ними, нажмите клавиши <Shift>+<Ctrl>+<F9>.

И так в этом уроке мы рассмотрели основные приемы отладки программы AutoLISP.

К этим приемам относятся:

  • Проверка фрагментов кода в окне «Консоль Visual LISP».
  • Отслеживание парных кавычек.
  • Поиск парных скобок в процессе и после написания кода.
  • Использование окна «Контрольное значение»

Искренне надеюсь, что отладка программ AutoLISP стала для Вас теперь легкой, занимательной головоломкой.

Пишите в комментариях:

Была ли для Вас полезной информация, данная в этом уроке?

Какие способы отладки используете Вы?

На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?

Я с удовольствием отвечу на ваши комментарии.

Если вы хотите получать новости с моего сайта. Оформляйте подписку.

До новых встреч.

 «Автор: Михаил Орлов»

Google

Также на эту тему Вы можете почитать:


Добро пожаловать!

Войдите или зарегистрируйтесь сейчас!

Войти

Несколько слов об ошибках в Geo_Tools

Здесь что то вроде FAQ пополам с особенностями geo_tools.

  • Обзoр
  • Рецензии (2)
  • Обсуждение

Страница 6 из 10


  1. Андрей_

    Форумчанин

    Регистрация:
    9 авг 2011
    Сообщения:
    396
    Симпатии:
    595
    Адрес:

    г.Саратов

    Бешеный2012, Инструменты работают начиная с 2008 версии автокадов.

    #101


  2. Бешеный2012

    Форумчанин

    Регистрация:
    15 мар 2016
    Сообщения:
    46
    Симпатии:
    5
    Адрес:

    РК

    :Sad: печально

    #102


  3. Денис12

    Форумчанин

    Регистрация:
    9 апр 2016
    Сообщения:
    39
    Симпатии:
    0

    Команда: _APPLOAD acaddoc.lsp успешно загружено.
    Команда:
    Ошибка попытки загрузки исходных функций Geo Tools!
    Команда:

    не пойму что с этим делать. Палитры не загрузились, у меня только стандартные автокадовские палитры
    Да, забыл сказать, у меня 2015 версия

    #103


  4. Андрей_

    Форумчанин

    Регистрация:
    9 авг 2011
    Сообщения:
    396
    Симпатии:
    595
    Адрес:

    г.Саратов

    Денис12, Инструкция по установке:

    Судя по всему вы не выполнили это условие.

    #104


  5. slgeo

    Регистрация:
    9 мар 2015
    Сообщения:
    8
    Симпатии:
    0

    Добрый день. При заполнение контуров ничего не происходит. Автокад Civil 2017. Создаю чертеж далее выполняю команду БСоздать в открывшийся чертеж вставляю свою съемку рисую полилинию или контуром из условных обозначений далее выбираю штриховку появляется подсказка выбрать замкнутый контур нажимаю на контур то что прописывается в командной строке прикладываю во вложении

    Вложения:

    • Контур.png

    #105


  6. Андрей_

    Форумчанин

    Регистрация:
    9 авг 2011
    Сообщения:
    396
    Симпатии:
    595
    Адрес:

    г.Саратов

    slgeo, можно нажать F2 и посмотреть не видно ли ошибок выше в командной строке. Попробуйте приложить файл в котором не получается. У меня работает…

    Вложения:

    #106


  7. slgeo

    Регистрация:
    9 мар 2015
    Сообщения:
    8
    Симпатии:
    0

    Вложения:

    • Контур 1.png

    #107


  8. Андрей_

    Форумчанин

    Регистрация:
    9 авг 2011
    Сообщения:
    396
    Симпатии:
    595
    Адрес:

    г.Саратов

    slgeo, ваша полилиния не замкнута.

    Вложения:

    • Снимок.JPG

    #108


  9. dilshod4ik

    Форумчанин

    Регистрация:
    12 окт 2014
    Сообщения:
    91
    Симпатии:
    6

    Здравствуйте. Я устанавливаю Гео тоолс на автосад 2018(англ). Почему то он у меня не работает, ничего не показывает. При установке гео тоолс, спрашивал запуск. Я его запускаю, открывает автокад и ошибка какая то, помогает только диспечер задач. Помогите плииз как с этим боротся.

    #109


  10. Андрей_

    Форумчанин

    Регистрация:
    9 авг 2011
    Сообщения:
    396
    Симпатии:
    595
    Адрес:

    г.Саратов

    Приветствую.
    Ничего не понял. Какой запуск? Какая ошибка? Если приложите картинки с экрана будет намного лучше.

    #110


  11. dilshod4ik

    Форумчанин

    Регистрация:
    12 окт 2014
    Сообщения:
    91
    Симпатии:
    6

    Сам не пойму какая ошибка, когда эта ошибка кроме чем закрыть автокат через диспечер задач, ничего не помогает. У коллега сивил на русском, а у меня автокад на английском. У него сохраненные чертежы тоже не открывает, и менно та же ошибка вылазит.

    #111


  12. Александр_гео

    Форумчанин

    Регистрация:
    25 май 2013
    Сообщения:
    147
    Симпатии:
    72

    Всем доброго здоровья!
    При вычерчивании откоса средствами geo_tools в режиме «откос линия» по дуге столкнулся с такой проблемой: при изменении направления дуги меняется направление откоса. Если чертить откос просто полилинией, то все идет нормально.
    Скриншот прилагаю.

    Вложения:

    • 2019-02-23_19-30-12.png

    #112


  13. Андрей_

    Форумчанин

    Регистрация:
    9 авг 2011
    Сообщения:
    396
    Симпатии:
    595
    Адрес:

    г.Саратов

    Здравствуйте!
    Не обращал внимания, но так и есть! Странно. Но это сам автокад виноват, судя по всему на дугах заморочки по поводу ориентации от центра фигуры, а не от последовательности точек. Как вариант для «перевёрнутых» откосов использовать тип линии «ОТКОС_R» — он такой же как обычный только в другую сторону от линии.

    #113


  14. Rail_tot

    Форумчанин

    Регистрация:
    28 мар 2012
    Сообщения:
    25
    Симпатии:
    2

    Autocad 2017, очень помогло! только после этого появились палитры.

    #114


  15. Повчун

    Добрый день.
    Autocad Civil 3D 2018. Установил geo_tools все как в инструкции. Создал профиль. Но при «редактировании текущего профиля» выскакивает
    Текущий профиль: 1; ошибка: неверный тип аргумента: fixnump: nil
    Профиль создан «Геологический разрез по площади».
    Заранее благодарю.

    Вложения:

    • Без имени.png

    #114


  16. Qvinto

    Форумчанин

    Возможно, у вас текущий профиль назначен один, а редактировать вы собираетесь профиль с другим именем. На скрине у вас подсмотрел, что их несколько у вас.
    Назначьте текущее имя редактируемого профиля, и пробуйте его редактировать.

    #115


  17. Повчун

    Благодарю, но в том то и дело текущий профиль выбран. Уже проверил, так чтоб профиль один был, остальные удалены. Все та же ошибка.

    #116


  18. Qvinto

    Форумчанин

    Попробуйте этот чертёж на другой машине.
    А профиль, подвал, вы сами настраивали? Или стандартный, из списка?

    #117


  19. Повчун

    Я разобрался. Чтобы начать редактирование нужно внести хотя бы несколько изменений на профиле, например нанести отметку или вычислить линию… после чего редактор текущего профиля не ругается и даёт редактировать.
    Благодарю )

    #118


  20. ПавелКот

    Форумчанин

    Регистрация:
    22 апр 2013
    Сообщения:
    117
    Симпатии:
    0

    Здравствуйте.
    Автокад 2017 на Win10, установил GeoTools 2017.10.05 23-01. При попытке использовать штриховка саженый лес пишет Неизвестная команда 1:1 — см рисунок. Как решить проблему?

    Вложения:

    • ошибка .png

    #119


  21. ПавелКот

    Форумчанин

    Регистрация:
    22 апр 2013
    Сообщения:
    117
    Симпатии:
    0

    Разобрался, полилиния была не замкнута.

    #120

Страница 6 из 10

Поделиться этой страницей

The error:

; error: bad argument type: fixnump: nil

Arises when a function requiring an integer argument is supplied with a value of nil. Hence, this error is arising from the evaluation of the second of your two itoa expressions:

(itoa (cdr (assoc 'v inreg)))

(Since the first itoa expression is being supplied with the variable n, which cannot be nil).

This implies that the following expression returns nil:

(cdr (assoc 'v inreg))

Which implies that one of the association lists within the list held by your global variable DP_DATA does not contain a dotted pair with key v. I would therefore suggest checking the value held by your global variable DP_DATA.


Aside: note that initget has no effect on a getstring prompt — you can achieve the same effect using a basic while loop, e.g.:

(while (= "" (setq prenume (getstring "nIntroduceti prenumele: ")))
    (princ "nPlease enter a first name.")
)
(while (= "" (setq nume (getstring "nIntroduceti numele: ")))
    (princ "nPlease enter a surname.")
)

You can account for null values in your association list using some basic error checking:

(defun C:DP_ADINREG ( / prenume nume varsta )
    (while (= "" (setq prenume (getstring "nIntroduceti prenumele: ")))
        (princ "nPlease enter a first name.")
    )
    (while (= "" (setq nume (getstring "nIntroduceti numele: ")))
        (princ "nPlease enter a surname.")
    )
    (initget 7)
    (setq varsta  (getint "nIntroduceti varsta: ")
          DP_DATA (cons (list (cons 'pn prenume) (cons 'nf nume) (cons 'v varsta)) DP_DATA)
    )
    (princ)
)

(defun C:DP_LISTARE ( / n )
    (setq n 0)
    (foreach lst (reverse DP_DATA)
        (princ
            (strcat
                "nInregistrarea #" (itoa (setq n (1+ n)))
                ": " (cond ((cdr (assoc 'pn lst))) (""))
                ", " (cond ((cdr (assoc 'nf lst))) (""))
                ". Varsta " (itoa (cond ((cdr (assoc 'v lst))) (0)))
            )
        )
    )
    (princ)
)

The above will return a blank first name/surname where not present, and an age of 0 where not present; you could alternatively return an error if these values are not present, e.g.:

(defun C:DP_LISTARE ( / n nf pn v )
    (setq n 1)
    (foreach lst (reverse DP_DATA)
        (if
            (and
                (setq pn (cdr (assoc 'pn lst)))
                (setq nf (cdr (assoc 'nf lst)))
                (setq v  (cdr (assoc 'v lst)))
            )
            (princ (strcat "nInregistrarea #" (itoa n) ": " pn ", " nf ". Varsta " (itoa v)))
            (princ (strcat "nMissing data for item " (itoa n)))
        )
        (setq n (1+ n))
    )
    (princ)
)

  • Ошибка невозможно запустить process failed to start параметр задан неверно
  • Ошибка неверный тип аргумента file nil
  • Ошибка невозможно запросить shsh
  • Ошибка неверный тип аргумента 2d 3d точка nil
  • Ошибка невозможно записать файлы проверьте адреса результатов cinema 4d