【问题标题】:Error Bad argument type : fixnump : nil when calling second function错误参数类型错误:fixnump:调用第二个函数时为零
【发布时间】:2020-04-17 17:02:36
【问题描述】:

我正在尝试创建一个列表数组,其元素为: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。

现在我不知道问题出在哪里。

有什么想法吗?

【问题讨论】:

  • 如果 assoc 返回 nil(当列表中缺少 'v 时),cdr 也是 nil,并且 itoa 将失败(根据其他 Lisp 方言的工作方式猜测)

标签: lisp autolisp


【解决方案1】:

错误:

;错误:错误的参数类型: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)
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2015-12-16
    相关资源
    最近更新 更多