第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

通過SWIG從C ++調(diào)用Go回調(diào)函數(shù)

通過SWIG從C ++調(diào)用Go回調(diào)函數(shù)

Go
慕勒3428872 2021-05-18 06:06:40
我正在嘗試調(diào)用C ++函數(shù):void TestFunc(void(*f)(void)) { f(); }從Go Code。我真的希望它只是將Go函數(shù)傳遞給該函數(shù)。我知道我可以將其包裝到一個(gè)類中,并使用%feature(“ director”)解決它,但這并不是我的最佳解決方案。從我在本頁中看到的內(nèi)容來看,Go中的函數(shù)指針應(yīng)與C ++中的相同,因此我嘗試了以下.swig文件:%{#include "test.h"%}%typemap(gotype) FUNC* "func()"%typemap(in) FUNC* {  $1 = (void(*)(void))$input;}%apply FUNC* { void(*)(void) };%include "test.h"我很驚訝它最初會起作用,但是后來發(fā)現(xiàn)它并不總是起作用:(。例如,在此Go代碼中,它可以按預(yù)期工作: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")}我實(shí)際上得到:SUCCESSSIGILL: illegal instructionPC=0x4c20005d000goroutine 1 [syscall]:test_wrap._swig_wrap_TestFunc(0x400cb0, 0x400c2a)        base_go_test__wrap_gc.c:33 +0x32test_wrap.TestFunc(0x400cb0, 0x2)        base_go_test__wrap.go:37 +0x25main.main()        test.go:8 +0x2agoroutine 2 [syscall]:created by runtime.main        go/gc/src/pkg/runtime/proc.c:225rax     0x0rbx     0x0rcx     0x0rdx     0x8rdi     0x4c200073050rsi     0x4c20004c0f0rbp     0x0rsp     0x4c20004c100r8      0x2r9      0x4b0ae0r10     0x4f5620r11     0x4dbb88r12     0x4f5530r13     0x7fad5977f9c0r14     0x0r15     0x3rip     0x4c20005d000rflags  0x10202cs      0x33fs      0x0gs      0x0請注意,它確實(shí)打印了“ SUCCESS”,這意味著函數(shù)DID運(yùn)行了,即使我將更復(fù)雜(又長)的代碼放入該函數(shù)中,它也能完美執(zhí)行,但并沒有返回:(。請讓我知道您的想法,以及如何解決此問題。我不介意在C ++部分上添加一些代碼,但我確實(shí)希望Go部分看起來“干凈”。
查看完整描述

1 回答

?
翻翻過去那場雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊

成功!我有一個(gè)可行的解決方案:


我所做的想法是用“ director”包裝回調(diào),然后將Go函數(shù)指針返回“ Go”,以便可以在該上下文中運(yùn)行它。


下面的解決方案并不完美,但已經(jīng)足夠滿足我的需求,從現(xiàn)在開始很容易使其完美。


C ++文件:


class Callback {

 public:

  virtual void Run(void(*f)(void)) = 0;

  virtual ~Callback() {}

};


Callback* GlobalCallback;


void TestFunc(void(*f)(void)) {

  GlobalCallback->Run(f);

}

我添加了一個(gè)Callback類,它將在Go中“擴(kuò)展”(使用Swig導(dǎo)演),并且我將擁有該擴(kuò)展類的全局實(shí)例。因此,調(diào)用該實(shí)例的Run()將調(diào)用Go函數(shù),該函數(shù)將接收一個(gè)函數(shù)指針。


請注意,我的TestFunc現(xiàn)在不只是運(yùn)行f(),而是通過GlobalCallback運(yùn)行它。添加另一個(gè)函數(shù)將返回一個(gè)指向運(yùn)行GlobalCallback-> Run(f)的函數(shù)的指針,然后將此指針傳遞給該函數(shù)而不是* f,這很容易解決。


我的Swig文件:


%{

#include "test.h"

%}


%module(directors="1") Callback

%feature("director");


%typemap(gotype) FUNC* "func()"

%typemap(in) FUNC* {

  $1 = (void(*)(void))$input;

}

%apply FUNC* { void(*)(void) };


%include "test.h"


%insert(go_wrapper) %{

type go_callback struct { }


func (c* go_callback) Run(f func()) {

  f()

}


func init() {

  SetGlobalCallback(NewDirectorCallback(&go_callback{}))                                                                                                     

}

%}

請注意,我已經(jīng)添加了一個(gè)init()函數(shù),該函數(shù)通過運(yùn)行指針的Go函數(shù)來設(shè)置GlobalCallback。


就是這樣,Go代碼保持原樣,并且可以正常工作:)


查看完整回答
反對 回復(fù) 2021-05-24
  • 1 回答
  • 0 關(guān)注
  • 300 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號