lambda-GTK negative Zeiger
-
20-09-2019 - |
Frage
Ich habe versucht, mein eigenes Put-Pixel auf (Gdk) pixbuf in Lisp zu schreiben. Als ich endlich erkannt, wie ich auf C Zeiger in CL arbeiten kann, kam neues Hindernis entlang - (GDK: pixbuf-get-Pixel pb) gibt mir negative Zahl. Meine Frage ist: kann ich wandeln es irgendwie auf einen gültigen Zeiger? Meine Versuche zur Verwendung cffi: convert-von-Außen- und cffi. Übersetzen-from-Fremd (Was ist der Unterschied zwischen ihnen sowieso) ist fehlgeschlagen
Im Folgenden finden Sie mein tatsächlicher (nicht funktioniert) Code:
(defun put-pixel (pixbuf x y r g b)
(let ((p (+ (gdk:pixbuf-get-pixels pixbuf) (* x (gdk:pixbuf-get-n-channels pixbuf)) (* y (gdk:pixbuf-get-rowstride pixbuf)))))
(setf (cffi:mem-aref p :unsigned-char 0) r)
(setf (cffi:mem-aref p :unsigned-char 1) g)
(setf (cffi:mem-aref p :unsigned-char 2) b)))
Lösung
ich denke, dass Lambda-gtk falsch definiert Bindung für pixbuf-get-Pixel.
Der negativer Wert für Zeigerwert könnte wegen falscher Interpretation von unsigned integer als Ganzzahl mit Vorzeichen angezeigt.
Der einfachste Weg, um diesen Wert zu korrigieren, ist mod :
CL-USER> (mod -1 (expt 2 #+cffi-features:x86 32 #+cffi-features:x86-64 64))
4294967295
Andere Tipps
CFFI: UEBER-FROM-FOREIGN ist eine generische Funktion. Sie können Ihre eigenen fremden Typen mit CFFI definieren: DEFINE-FOREIGN-TYPE und fügen Sie dann ein Verfahren zu CFFI. UEBER-FROM-FOREIGN angeben, wie die Umsätze aus dem Ausland sollten Lisp Werte arbeiten
CFFI: CONVERT-FROM-FOREIGN ist, was Sie nennen sollten, wenn Sie brauchen explizit einen Wert zu umwandeln. Es wird CFFI nennen. UEBER-FROM-FOREIGN hinter den Kulissen und es könnte einige Kompilierung-Optimierungen, wenn möglich durchführen
Das gleiche gilt für CFFI: CONVERT-TO-FOREIGN und CFFI. UEBER-TO-FOREIGN