Mendapatkan akses memori yang tidak valid (sinyal 11) saat menggunakan pengikatan OpenGL Crystal (glGenBuffers)

Silakan lihat di sini, program sepele yang saya coba agar berfungsi:

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)

Akan crash dengan kesalahan ini:

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

Saya baru mengenal Crystal, jadi saya tidak yakin apakah saya melakukan kesalahan dengan nilai x yang diteruskan ke fungsi, atau apakah ada masalah yang lebih dalam dengan binding atau kristal itu sendiri. Berharap beberapa pakar Crystal+OpenGL di sini mungkin dapat membantu!

Referensi:


person doughsay    schedule 02.07.2017    source sumber


Jawaban (1)


Saya menjawab pertanyaan saya sendiri sebelum memposting, tetapi tetap berpikir pertanyaan itu harus dibagikan:

Hal ini terjadi jika tidak ada konteks OpenGL yang diinisialisasi. Contoh yang direvisi (berfungsi) ada di bawah, menggunakan pustaka GLFW dan LibGLFW untuk membuka jendela dan mengatur konteks saat ini:

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

Harap diperhatikan, array HARUS diinisialisasi dengan jumlah nilai "return" yang diharapkan. menggunakan x = [] of UInt32 akan crash dengan kesalahan yang sama. Jadi pastikan Anda telah membuat array n 0, dimana n adalah jumlah buffer yang Anda minta untuk diinisialisasi.

person doughsay    schedule 02.07.2017
comment
Masih cukup baru di Crystal jadi saya tidak mengetahui kata kunci out ketika saya menulis ini. Cara yang mungkin sedikit lebih baik untuk menangani panggilan fungsi c asing yang mengembalikan nilai menggunakan pointer adalah dengan menggunakan out, seperti: LibGL.gen_buffers(1, out buffer_id). - person doughsay; 03.07.2017