SIGSEGV MAPERR в Racket при вызове Raylib через FFI - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь использовать Raylib (https://www.raylib.com/, https://github.com/raysan5/raylib) из кода Racket через FFI. Вот самый простой пример:

#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, и в Guile все прекрасно работает.

1 Ответ

0 голосов
/ 18 января 2019

Похоже, вы на самом деле не звоните либо InitWindow, либо SetFPS.

Вместо (void InitWindow 640 480 "Test window") попробуйте (InitWindow 640 480 "Test window").

...