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)))
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top