Как использовать функцию обратного вызова из библиотеки Голанга? - PullRequest
0 голосов
/ 27 февраля 2019

Я все еще относительно новичок в Go и решил попробовать OpenGL, так как существует библиотека Go, которая обеспечивает привязки для этого.В рамках настройки OpenGL мне нужно использовать библиотеку Go glfw .Мне нужно использовать библиотечную функцию glfw SetFramebufferSizeCallback , для которой требуется аргумент типа FrameBuffersizeCallback ;поэтому мне по сути нужно передать функцию, соответствующую сигнатуре этого типа, что я считаю, что я сделал.Тем не менее, я получаю следующую ошибку:

. / Main.go: 43: 35: не могу использовать fbCallback (тип func (* glfw.Window, int32, int32)) как тип glfw.FramebufferSizeCallbackв аргументе для окна. SetFramebufferSizeCallback

И я действительно не уверен, почему это происходит.Я проверил, что моя версия glfw соответствует документации;Я проверил код для реализации на github и моей машине, и все это соответствует.Так что я понятия не имею, что я делаю не так.Вот мой код, он не должен делать ничего интересного, если построен, но демонстрирует ошибку:

package main

import (
    "github.com/go-gl/gl/v3.3-core/gl"
    "github.com/go-gl/glfw/v3.2/glfw"
    "log"
    "runtime"
)

func fbCallback(window *glfw.Window, width int32, height int32) {
    gl.Viewport(0, 0, width, height)
}

func init() {
    runtime.LockOSThread()
}

func main() {
    err := glfw.Init()
    if err != nil {
        panic(err)
    }

    defer glfw.Terminate()

    glfw.WindowHint(glfw.ContextVersionMajor, 3)
    glfw.WindowHint(glfw.ContextVersionMinor, 3)
    glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)

    window, err := glfw.CreateWindow(640, 480, "Testing", nil, nil)

    if err != nil {
        panic(err)
    }

    window.MakeContextCurrent()

    if err := gl.Init(); err != nil {
        log.Fatalln(err)
    }

    gl.Viewport(0, 0, 800, 600)
    window.SetFramebufferSizeCallback(fbCallback) //Does not work
}

Мое понимание того, как это должно действительно работать, продемонстрировано в следующей короткой программе, которая работает.Я был бы рад, если бы кто-то указал, почему этот короткий пример работает, а выше - нет.У меня могут быть некоторые дыры в моем понимании.

package main

import (
    "fmt"
)

type callback func(int, int) int

func sum(x int, y int) int {
    return x + y
}

func useCallback(cb callback) {
    result := cb(2, 3)
    fmt.Println(result)
}

func main() {
    useCallback(sum)
}

1 Ответ

0 голосов
/ 27 февраля 2019

https://github.com/go-gl/glfw/blob/2484f3e51bc432ea9f7daa182e418d5522201176/v3.2/glfw/window.go

type FramebufferSizeCallback func(w *Window, width int, height int)

против

func fbCallback(window *glfw.Window, width int32, height int32)

Ваша функция не имеет той же сигнатуры, она использует int32 вместо int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...