【问题标题】:dyncall callback error when switching from 64 to 32 bit从 64 位切换到 32 位时的 dyncall 回调错误
【发布时间】:2016-04-15 13:12:23
【问题描述】:

我准备了一个最小的可重现示例。

当我使用 64 位 mingw 编译并链接到 64 位版本的 dyncall 库时,打印的结果就是预期的 2.5000

切换到 32 位并在 make clean 之后得到打印结果 0.0000

问题仅在于 dyn-callbacks,dyncalls 似乎工作正常。

#include <stdio.h>
#include <assert.h>
#include <dynload/dynload.h>
#include <dyncall/dyncall.h>
#include <dyncallback/dyncall_callback.h>

char mul_cbHandler ( DCCallback *cb,
        DCArgs *args, //DCArgs
        DCValue *result,
        void *userdata) {
    double a = dcbArgDouble(args);
    double b = dcbArgDouble(args);
    printf("got args: %f %f\n", a, b);
    result->d = a*b; // d: double
    return 'f'; // i or f
}

typedef double (*fptr_d_dd)(double x, double y);

void callbReceiver(fptr_d_dd fptr) {
    printf("res: %f\n", fptr(5.0f, 0.5f));
}
void testCallback() {
    DCCallVM* vm = dcNewCallVM(4096);
    assert(vm);
    DCCallback* pcb = dcbNewCallback("dd)d", mul_cbHandler, 0);
    assert(pcb);
    callbReceiver((fptr_d_dd)pcb);
    dcbFreeCallback(pcb);
    dcFree(vm);
}

int main(void) {
    testCallback();
    printf("q\n");
    return 0;
}

【问题讨论】:

    标签: c dyncall


    【解决方案1】:

    我写信给开发者并立即得到答复。

    0.9 版manual.pdf 不再将返回签名限制为if。我们可以指定d

    确认它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 2013-08-22
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      相关资源
      最近更新 更多