错误调用第二个函数时,错误的参数类型:fixnump:nil



我正在尝试创建一个列表数组,其元素为:SurnameNameAge

这是我在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的值。


注意:initgetgetstring提示没有影响-您可以使用基本的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)
)

相关内容

最新更新