Преобразование из и в void * (C++)

-8

Мне нужно вызвать функцию, которая принимает параметр void * как дополнительные данные и два параметра функции.

Эти две функции получают дополнительные данные. Я хочу упаковать int и два двойных массива в дополнительный параметр данных. Мне также нужно их распаковать.

Упаковка в:

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

спросил(а) 2021-01-19T13:33:17+03:00 6 месяцев назад
1
Решение
63

Вы можете просто отбросить вещи из void *:

int ncams = *reinterpret_cast<int*>(adata[0]);
double *affineAndPts2D = reinterpret_cast<double*>(adata[1]);
double *intrinsics = reinterpret_cast<double*>(adata[2]);

ответил(а) 2021-01-19T13:33:17+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема