【问题标题】:iOS: using vDSP functions in 64bitiOS:在 64 位中使用 vDSP 功能
【发布时间】:2014-04-27 21:58:11
【问题描述】:

在 iOS 中,我有一个依赖于 vDSP_vgathr 的函数调用,它是 Apple 的 Accelerate framework 的成员:

int pix = image.size.height * image.size.width;
float * array = (float *)malloc(sizeof(float) * pix * 4);
float * colorPlane = (float *)malloc(sizeof(float) * pix);
float * y_r = (float *)malloc(sizeof(float) * pix)
int * malloc(sizeof(int) * pix)

vDSP_vgathr(colorPlane, (const vDSP_Length *)idx, 1, y_r, 1, (int)(rate*pix));

我看到an SO question 与我得到的错误、EXC_I386_GPFLT、64 位系统和非规范指针有关。我见过的solution(和another one)建议包括tgmath.h,但是当使用(成功编译)时,它什么也不做,我仍然得到EXC_I386_GPFLT

我尝试了许多其他潜在的解决方案,包括对各种对象和不同的函数调用进行类型转换。我怎样才能使这个函数调用在 64 位架构下工作?

【问题讨论】:

  • tgmath 绝对不会与您遇到的问题有任何关系。您的代码示例中没有足够的信息来说明发生了什么;你能提供一个实际的可编译版本的代码来演示这个问题吗?

标签: ios floating-point 32bit-64bit accelerate-framework vdsp


【解决方案1】:

vDSP_vgathr 的文档说它被定义为

void vDSP_vgathr (
   float *__vDSP_A,
   vDSP_Length *__vDSP_B,
   vDSP_Stride __vDSP_J,
   float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   vDSP_Length __vDSP_N
);

您将一个 int 传递给该函数,而 vDSP_Length 被定义为 unsigned long. 所以,传递一个 unsigned long in:

unsigned long * idxSend = (unsigned long *)malloc(sizeof(unsigned long) * N);
for (i=0; i<N; i++) idxSend[i] = (unsigned long)idx[i];
vDSP_vgathr(..., idxSend, ...);

这解决了你的问题。

【讨论】:

    猜你喜欢
    • 2011-08-13
    • 1970-01-01
    • 2019-07-02
    • 2021-06-06
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    相关资源
    最近更新 更多