scheme - 通过 FFI 调用 Raylib 时 Racket 中的 SIGSEGV MAPERR

标签 scheme lisp racket ffi

我正在尝试通过 FFI 使用来自 Racket 代码的 Raylib(https://www.raylib.com/https://github.com/raysan5/raylib)。这是最简单的例子:

#lang racket
(require ffi/unsafe
         ffi/unsafe/define)

; raylib shared object must be available for Racket
; for example, in Linux it must be in
; ~/.racket/<racket-version>/lib> or /usr/lib/racket
(define-ffi-definer define-raylib (ffi-lib "libraylib" #:global? #t))

(define-raylib BeginDrawing (_fun  -> _void))
(define-raylib CloseWindow (_fun -> _void))
(define-raylib EndDrawing (_fun -> _void))
(define-raylib InitWindow (_fun _int _int _string -> _void))
(define-raylib SetTargetFPS (_fun _int -> _void))
(define-raylib WindowShouldClose (_fun -> _int))

(void InitWindow 640 480 "Test window")
(void SetTargetFPS 60)

(define (main-loop)
        (BeginDrawing)
        (EndDrawing)
        (if (= (WindowShouldClose) 0)
            (main-loop)
            (CloseWindow)))

(main-loop)

但即使是这个非常简单的示例也会崩溃并显示以下消息:

SIGSEGV MAPERR si_code 1 fault on addr (nil)
Aborted (core dumped)

看起来它在调用 BeginDrawing() 函数时崩溃了。这个函数的代码也很简单:

// Setup canvas (framebuffer) to start drawing
void BeginDrawing(void)
{
    currentTime = GetTime();            // Number of elapsed seconds since InitTimer()
    updateTime = currentTime - previousTime;
    previousTime = currentTime;

    rlLoadIdentity();                   // Reset current matrix (MODELVIEW)
    rlMultMatrixf(MatrixToFloat(downscaleView));       // If downscale required, apply it here
}

带有 rl 前缀的函数是 OpenGL 包装器。可能是 OpenGL 上下文问题?

我尝试在 Guile Scheme 中调用相同的函数,在 Guile 中一切正常。

最佳答案

看起来您实际上并没有调用 InitWindowSetFPS

代替 (void InitWindow 640 480 "Test window"),试试 (InitWindow 640 480 "Test window")

关于scheme - 通过 FFI 调用 Raylib 时 Racket 中的 SIGSEGV MAPERR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54127398/

相关文章:

lisp - 简单的计划。第 8 章高阶函数

scope - 检查范围是词法还是动态的程序

functional-programming - 为什么在Scheme/Dr.中是(max (sin (/5 3)) (sqr 12)) Racket(初级学生语言)评估为不精确?

macros - 使用 Racket 生成日志信息

scheme - 计划和 Racket 中的案例和报价

lambda - 对Scheme中定义的参数: lambdas vs.的不同处理

linux - Ubuntu中Mit Scheme安装错误(环境变量设置)

recursion - edwin 方案中的未绑定(bind)变量

list - 附加列表以显示在 Racket 的文本字段中

lisp - 如何解决 lisp 中格式错误的 lambda?