从*转换为void *(C ++)

时间:2014-11-05 17:19:40

标签: android c++

我必须调用一个接受void *参数作为附加数据和两个函数参数的函数。

这两个函数接收附加数据。 我想将一个int和两个double数组打包到附加数据参数中。我还需要能够打开它们。

包装:

double *AffineAndPoints2d;
double *Intrinsics;
int ncams;
...
LOGD("3.4 %d", ncams);
LOGD("3.5 %f", Intrinsics[2]);
LOGD("3.6 %f", AffineAndPoints2d[4]);
void* adata[3];
adata[0]=&ncams;
adata[1]=AffineAndPoints2d;
adata[2]=Intrinsics;

在上述某个功能中解压缩:

static void proj_motstr(int j, int i, double *aj, double *bi, double *xij, void *adata)
{
   int *ncams=((int **)&adata)[0];
   double *affineAndPts2D = ((double **)((&adata + sizeof(int *))))[0];
   double *intrinsics = ((double **)((&adata + sizeof(int *))))[1];
   LOGD("4.4 %d", *ncams);
   LOGD("4.5 %f", intrinsics[2]);
   LOGD("4.6 %f", affineAndPts2D[4]);
}

所有这些都在Android JNI中,但这是无关紧要的。

输出:

3.4 3
3.5 -625.041382
3.6 563.992036
4.4 1603595320
4.5 -0.000000
Fatal signal 7 (SIGBUS) at 0x5f2a4c15 (code=1), thread 30116 (Thread-9197)

完整代码:http://pastebin.com/0YwfVzyA

我不知道我在做什么。请帮忙!


这是proj_motstr的更新版本,应该有效。

static void proj_motstr(int j, int i, double *aj, double *bi, double *xij, void *adata)
{
   void** in = (void**)data;
   int *ncams=(int *)(in[0]);
   double *affineAndPts2D = (double *)(in[1]);
   double *intrinsics = (double *)(in[2]);

   LOGD("4.4 %d", *ncams);
   LOGD("4.5 %f", intrinsics[2]);
   LOGD("4.6 %f", affineAndPts2D[4]);

   projHybrid(j, i, aj, bi, (double)(*ncams), affineAndPts2D, intrinsics, xij);
}

1 个答案:

答案 0 :(得分:1)

你可以从void *:

中重新投射
int ncams = *reinterpret_cast<int*>(adata[0]);
double *affineAndPts2D = reinterpret_cast<double*>(adata[1]);
double *intrinsics = reinterpret_cast<double*>(adata[2]);