2009-11-17 4 views
3

나는 Lisp에서 (Gdk) pixbuf에 내 자신의 put-pixel을 쓰려고했다. 마침내 CL에서 C 포인터를 어떻게 처리 할 수 ​​있는지 깨달았을 때 새로운 장애물이 발생했습니다 - (gdk : pixbuf-get-pixels pb)는 저에게 음수를 반환합니다. 내 질문은 : 어떻게 든 유효한 포인터로 변환 할 수 있습니까? cffi : 외래 전환 및 cffi : 외국어 번역 (어쨌든 그들 사이의 차이점은 무엇입니까?)을 사용하려는 나의 시도는 실패했습니다.람다-gtk 음수 포인터

(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))) 

답변

2

나는 lambda-gtk가 pixbuf-get-pixels에 대한 바인딩을 잘못 정의했다고 생각합니다.

부호없는 정수가 부호있는 정수로 잘못 해석되어 포인터 값에 음수 값이 표시 될 수 있습니다. 뭔가 정말 그 함수 잘못된 것 같다,

CL-USER> (mod -1 (expt 2 #+cffi-features:x86 32 #+cffi-features:x86-64 64)) 
4294967295 
+0

음 :

이 값을 수정하는 가장 간단한 방법은 mod을 사용하는 것입니다. 나는 다른 접근법을 시도해야했다. – x13n

5

CFFI:TRANSLATE-FROM-FOREIGN는 일반적인 기능입니다 :

다음은 내 실제 (작동하지 않는) 코드입니다. CFFI:DEFINE-FOREIGN-TYPE을 사용하여 자신의 외부 형식을 정의한 다음 CFFI : TRANSLATE-FROM-FOREIGN에 메서드를 추가하여 외부에서 Lisp 값으로 변환하는 방법을 지정합니다.

CFFI:CONVERT-FROM-FOREIGN 일부 값을 명시 적으로 변환해야하는 경우 호출해야하는 부분입니다. 그것은 뒤에서 CFFI : TRANSLATE-FROM-FOREIGN을 호출 할 것이며 가능하면 컴파일 타임 최적화를 수행 할 수도 있습니다.

CFFI:CONVERT-TO-FOREIGNCFFI:TRANSLATE-TO-FOREIGN도 마찬가지입니다.