【问题标题】:Calling a Julia function from C++ that takes a Julia callback function as an argument从 C++ 调用 Julia 函数,该函数将 Julia 回调函数作为参数
【发布时间】:2016-07-01 01:36:11
【问题描述】:

我想从 C++ 调用一个 Julia 函数。这个 Julia 函数将另一个 Julia 函数作为参数(回调函数)。我也想完全用 C++ 编写这个回调函数,并将它直接传递给 Julia,而不像其他原始类型一样在 Julia 的名称空间中声明它的名称。大概我的回调函数的 C++ 实现的参数将有 jl_value_t * 作为它们的类型。

谁能给我一个如何做到这一点的例子? embedded Julia example 还不错,但好像不能说明这种情况。

更新:根据 Yakk 的回答进行了修改和澄清。

【问题讨论】:

    标签: c++ julia


    【解决方案1】:

    该示例涵盖了这种情况。

    这里我们称之为 c 函数:

    jl_eval_string("println( ccall( :my_c_sqrt, Float64, (Float64,), 2.0 )
    

    在示例顶部定义。

    在其他地方有一个定义 julia 函数的例子。定义一个在您的 c 代码中执行 ccall 的代码。

    jl_eval_string("my_func(x) = 2*x");
    

    (除了 2*x 不是 ccall(blah))。

    获取该 julia 函数,并获取指向它的指针(也在您的链接示例中)。

    jl_function_t *func = jl_get_function(jl_base_module, "reverse!");
    

    并将其传递给期望回调的 julia 函数。或者,使用 eval 按名称传递它。

    C++ 代码将通过这个计划传递doubles 等。

    【讨论】:

    • 感谢您的回复!所以我认为这可行,但我不想在 Julia 的名称空间中创建新函数(例如,my_func)。似乎这样会更干净,而且函数也应该是可能的,因为它对浮点数和整数都有效——它们被装箱并传递给 Julia,而无需创建全局 Julia 句柄。函数也可以吗?
    • 为什么命名空间是个问题?只需使用密码生成器来获取类似 vyQMNzqlL0ww9HCgjWBuqXmzRSvcaEeSSfnufJkvmzASjHcmOea3zDgLiVNMMaa 的名称
    • 如果您认为效率是个问题,您可能应该用相同的语言编写所有内容,或者重写您的 julia 函数以直接调用您的函数。 (宏可能会使伪动态)
    • 效率和清晰度是我主要关心的问题。我经常考虑从 C++ 调用 Julia,但我可能会以错误的方式思考这个问题,至少如果对密码生成器的输出进行硬编码是最干净的方法......感谢您的反馈:-)
    • @jeff 可能有一种方法可以做你想做的事,但我知道如果问题是我阅读了你提供的教程并注意到那里有你的问题的答案。您是否曾分析过这是一个瓶颈,还是只是假设?
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2022-11-12
    • 2016-05-16
    • 2017-02-01
    • 2015-04-07
    • 2018-08-19
    相关资源
    最近更新 更多