首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lambda-gtk负指针

lambda-gtk负指针
EN

Stack Overflow用户
提问于 2009-11-18 05:26:01
回答 2查看 208关注 0票数 3

我试着用Lisp语言在(Gdk) pixbuf上写我自己的put-pixel。当我最终意识到如何在CL中对C指针进行操作时,新的障碍出现了- (gdk:pixbuf-get-pixels pb)返回负数。我的问题是:我能以某种方式将它转换为有效的指针吗?我尝试使用cffi:convert-from-foreign和cffi:translate-from-foreign (它们之间有什么区别?)失败。

下面是我的实际代码(不工作):

代码语言:javascript
复制
(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)))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-18 13:33:36

我认为lambda-gtk错误地定义了pixbuf-get-pixels的绑定。

由于不正确地将无符号整数解释为有符号整数,因此可能会出现指针值的负值。

纠正此值的最简单方法是使用mod

代码语言:javascript
复制
CL-USER> (mod -1 (expt 2 #+cffi-features:x86 32 #+cffi-features:x86-64 64))
4294967295
票数 2
EN

Stack Overflow用户

发布于 2009-11-18 06:30:15

CFFI:TRANSLATE-FROM-FOREIGN是一个泛型函数。您可以使用CFFI:DEFINE-FOREIGN-TYPE定义自己的外部类型,然后将一个方法添加到CFFI:TRANSLATE- from -TRANSLATE中,以指定从外部值到Lisp值的转换应该如何工作。

如果您需要显式转换某些值,则应该调用CFFI:CONVERT-FROM-FOREIGN。它将在幕后调用CFFI:TRANSLATE-FROM-FOREIGN,如果可能的话,它可能会执行一些编译时优化。

同样的事情也适用于CFFI:CONVERT-TO-FOREIGNCFFI:TRANSLATE-TO-FOREIGN

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1751911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档