我正在尝试创建一个列表数组,其元素为:Surname
、Name
和Age
。
这是我在AutoLISP中的代码:
(defun C:DP_ADINREG ( / prenume nume varsta inreg)
(initget 1)
(setq prenume (getstring "nIntroduceti prenumele: "))
(initget 1)
(setq nume (getstring "nIntroduceti numele: "))
(initget 7)
(setq varsta (getint "nIntroduceti varsta: "))
(setq inreg (list (cons 'pn prenume) (cons 'nf nume)
(cons 'v varsta))
DP_DATA (append DP_DATA (list inreg))
)
(princ)
)
(defun C:DP_LISTARE ( / curent inreg n)
(setq curent DP_DATA
n 1)
(while curent
(setq inreg (car curent))
(princ (strcat "nInregistrarea #" (itoa n)
": " (cdr (assoc 'pn inreg))
", " (cdr (assoc 'nf inreg))
". Varsta " (itoa (cdr (assoc 'v inreg)))
)
)
(setq curent (cdr curent)
n (1+ n)
)
)
(princ)
)
问题是,当试图访问第二个函数时,它会给我一个错误,称为:
错误的参数类型:fixnump:nil。
现在我不知道问题到底在哪里。
有什么想法吗?
错误:
;错误:错误的参数类型:fixnump:nil
当为需要整数参数的函数提供值nil
时产生。因此,此错误源于对两个itoa
表达式中的第二个表达式的评估:
(itoa (cdr (assoc 'v inreg)))
(由于第一个itoa
表达式被提供有变量n
,该变量不能是nil
(。
这意味着以下表达式返回nil
:
(cdr (assoc 'v inreg))
这意味着全局变量DP_DATA
所持有的列表中的一个关联列表不包含关键字为v
的点对。因此,我建议检查全局变量DP_DATA
的值。
注意:initget
对getstring
提示没有影响-您可以使用基本的while
循环来实现相同的效果,例如:
(while (= "" (setq prenume (getstring "nIntroduceti prenumele: ")))
(princ "nPlease enter a first name.")
)
(while (= "" (setq nume (getstring "nIntroduceti numele: ")))
(princ "nPlease enter a surname.")
)
您可以使用一些基本的错误检查来解释关联列表中的空值:
(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)
)
以上内容将在不存在的情况下返回空白的名字/姓氏,在不存在时返回0
的年龄;如果这些值不存在,您也可以返回一个错误,例如:
(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)
)