-1

((pointerp (first args)) (mem-aref (%vector-float-to-c-array (first args)) :float (second args)))以下のコードのこの行で(second args)、警告が表示されてコンパイルされますThis is not a number NIL。関数は機能しますが、Lisp だけを使用して実装に依存しない方法でこの警告を取り除くにはどうすればよいですか。ソリューションは非常に高速である必要があります。コードが正しくなるまでに長い時間がかかり、うまく動作するので、その操作を実際に変更することはできません。認識できない機能は、警告が表示される限り、それほど重要ではありません...助けてくれてありがとう。

(defun vector-float (&rest args)
  (cond ((eq (first args) nil) (return-from vector-float (%vector-float)))
    ((listp (first args))
     (c-arr-to-vector-float (first args)))
    ((symbolp (cadr args)) (%vector-float-size (first args)))
    ((pointerp (first args)) (mem-aref (%vector-float-to-c-array (first args)) :float (second args)))
    (t nil)))
4

1 に答える 1

1

(second args)isの場合はnoまたはisのNILいずれかです。ただし、 の 3 番目の引数はインデックスであるため、数値でなければなりません。そこに問題があります。argssecondsecondNILmem-aref

プログラム(second args)で が許可されているNIL(または存在しない) 場合は、その可能性をテストし、に渡さないようにするNIL必要がありmem-arefます (オプションの引数を省略することもできます)。(second args)が許可されていない場合NIL、バグはプログラムの別の場所にあります。

例 (未テスト)、

(defun vector-float (&rest args)
    (cond
        ((null (first args))
            (return-from vector-float (%vector-float)))
        ((listp (first args))
            (c-arr-to-vector-float (first args)))
        ((symbolp (second args))
            (%vector-float-size (first args)))
        ((pointerp (first args))
            (if (null (second args))
                (mem-aref (%vector-float-to-c-array (first args)) :float)
                (mem-aref (%vector-float-to-c-array (first args)) :float (second args))))
        (t nil)))
于 2014-04-26T06:22:32.980 に答える