iOS:在64位中使用vDSP功能

时间:2014-03-20 19:39:23

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

在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。< / p>

我尝试了许多其他潜在的解决方案,包括类型转换各种对象和不同的函数调用。如何使用64位架构进行此函数调用?

1 个答案:

答案 0 :(得分: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:

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

这解决了你的问题。