Получение недопустимого доступа к памяти (сигнал 11) при использовании привязок OpenGL Crystal (glGenBuffers)

Пожалуйста, смотрите здесь, тривиальная программа, которую я пытаюсь заставить работать:

require "lib_gl"

x = [] of UInt32
# or
x = uninitialized Pointer(UInt32)
# or
x = [0_u32]

# From lib_gl:
# fun gen_buffers = "glGenBuffers"(n: Int32, buffers: UInt32*) : Void
LibGL.gen_buffers(1, x)

Вылетает с этой ошибкой:

Invalid memory access (signal 11) at address 0x1428
[0x10560900b] *CallStack::print_backtrace:Int32 +107
[0x1055f4a2c] __crystal_sigfault_handler +60
[0x7fff90988b3a] _sigtramp +26
[0x7fff7f455e83] glGenBuffers +19
[0x1055e4836] __crystal_main +1222
[0x1055f4928] main +40

Я новичок в Crystal, поэтому я не уверен, что я делаю что-то не так со значением x, передаваемым в функцию, или что-то более глубокое не так либо с привязками, либо с самим кристаллом. Надеюсь, что кто-нибудь из экспертов по Crystal+OpenGL сможет помочь!

Рекомендации:


person doughsay    schedule 02.07.2017    source источник


Ответы (1)


Я ответил на свой вопрос перед публикацией, но все же подумал, что им следует поделиться:

Это происходит, если нет инициализированного контекста OpenGL. Пересмотренный (рабочий) пример приведен ниже, используя библиотеки GLFW и LibGLFW для открытия окна и установки текущего контекста:

require "glfw"
require "lib_glfw"
require "lib_gl"

LibGLFW.init
window = GLFW::Window.new(800, 600, "Foo")
window.set_context_current

x = [0_u32]

LibGL.gen_buffers(1, x)

puts x

Однако обратите внимание, что массив ДОЛЖЕН быть инициализирован ожидаемым количеством «возвращаемых» значений. использование x = [] of UInt32 приведет к сбою с той же ошибкой. Поэтому убедитесь, что вы создали массив из n нулей, где n — это количество буферов, которые вы запрашиваете для инициализации.

person doughsay    schedule 02.07.2017
comment
Все еще новичок в Crystal, поэтому я не знал о ключевом слове out, когда писал это. Возможно, немного лучший способ обработки внешних вызовов функций c, которые возвращают значения с использованием указателей, заключается в использовании out, например: LibGL.gen_buffers(1, out buffer_id). - person doughsay; 03.07.2017