私はC++関数を呼び出そうとしています:
void TestFunc(void(*f)(void)) { f(); }
Goコードから。
Go関数をその関数に渡すだけでいいのですが。私はそれをクラスにラップし、%feature( "director")を使用してそれを解決できることを知っていますが、それは私の場合の最適な解決策ではありません。
このページで見たところ、Goで機能するためのポインターはC ++と同じであるはずなので、次の.swigファイルを試しました。
%{
#include "test.h"
%}
%typemap(gotype) FUNC* "func()"
%typemap(in) FUNC* {
$1 = (void(*)(void))$input;
}
%apply FUNC* { void(*)(void) };
%include "test.h"
最初はうまくいったので静かに驚きましたが、いつもうまくいくとは限らないことに気づきました:(。
たとえば、このGoコードでは、期待どおりに機能します。
import "fmt"
import "test_wrap"
func main() {
b := false
test_wrap.TestFunc(func() { b = true })
fmt.Println(b) // This actually DOES print "true"!
}
しかし、他の場合には、それは機能しません。たとえば、ここで:
import "fmt"
import "test_wrap"
func main() {
test_wrap.TestFunc(func() { fmt.Println("SUCCESS") })
fmt.Println("Done")
}
私は実際に得ます:
SUCCESS
SIGILL: illegal instruction
PC=0x4c20005d000
goroutine 1 [syscall]:
test_wrap._swig_wrap_TestFunc(0x400cb0, 0x400c2a)
base_go_test__wrap_gc.c:33 +0x32
test_wrap.TestFunc(0x400cb0, 0x2)
base_go_test__wrap.go:37 +0x25
main.main()
test.go:8 +0x2a
goroutine 2 [syscall]:
created by runtime.main
go/gc/src/pkg/runtime/proc.c:225
rax 0x0
rbx 0x0
rcx 0x0
rdx 0x8
rdi 0x4c200073050
rsi 0x4c20004c0f0
rbp 0x0
rsp 0x4c20004c100
r8 0x2
r9 0x4b0ae0
r10 0x4f5620
r11 0x4dbb88
r12 0x4f5530
r13 0x7fad5977f9c0
r14 0x0
r15 0x3
rip 0x4c20005d000
rflags 0x10202
cs 0x33
fs 0x0
gs 0x0
「SUCCESS」を出力したことに注意してください。これは、関数DIDが実行されたことを意味し、この関数にもっと複雑な(そして長い)コードを入れても、完全に実行されますが、戻ってきませんでした:(。
あなたの考えと、この問題を解決する方法を教えてください。C ++部分にコードを追加してもかまいませんが、Go部分を「クリーン」に見せたいと思っています。
ありがとうございました。