0

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

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));

我看到了一个与我得到的错误有关的问题EXC_I386_GPFLT,以及 64 位系统和非规范指针。我见过的解决方案(和另一个tgmath.h)建议包括,但是当使用(成功编译)时,它什么也不做,我仍然得到EXC_I386_GPFLT.

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

4

1 回答 1

0

文档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, ...);

这解决了你的问题。

于 2014-03-23T01:55:28.617 回答