присвоение ошибки выражению с типом массива - PullRequest
0 голосов
/ 20 марта 2019

У меня есть функция с именем unpack, и компиляция кода C ++ приводит к нескольким ошибкам. Код ниже:

static void unpack(void *v, ekf_t *ekf, int n, int m) {
    /* skip over n, m in data structure */
    char *cptr = (char *) v;
    cptr += 2 * sizeof(int);

    double *dptr = (double *) cptr;
    ekf->x = dptr;
    dptr += n;
    ekf->P = dptr;
    dptr += n * n;
    ekf->Q = dptr;
    dptr += n * n;
    ekf->R = dptr;
    dptr += m * m;
    ekf->G = dptr;
    dptr += n * m;
    ekf->F = dptr;
    dptr += n * n;
    ekf->H = dptr;
    dptr += m * n;
    ekf->Ht = dptr;
    dptr += n * m;
    ekf->Ft = dptr;
    dptr += n * n;
    ekf->Pp = dptr;
    dptr += n * n;
    ekf->fx = dptr;
    dptr += n;
    ekf->hx = dptr;
    dptr += m;
    ekf->tmp0 = dptr;
    dptr += n * n;
    ekf->tmp1 = dptr;
    dptr += n * m;
    ekf->tmp2 = dptr;
    dptr += m * n;
    ekf->tmp3 = dptr;
    dptr += m * m;
    ekf->tmp4 = dptr;
    dptr += m * m;
    ekf->tmp5 = dptr;
}

И я получаю эти ошибки, распространяемые по каждой строке кода:

.../src/ekf.c:203:12: error: assignment to expression with array type
     ekf->x = dptr;
            ^
.../src/ekf.c:205:12: error: assignment to expression with array type
     ekf->P = dptr;

Следует отметить, что код unpack был взят из библиотеки C. Я попытался использовать extern, но, похоже, это не слишком хорошо работает. Теперь, когда я make исходный репозиторий (https://github.com/simondlevy/TinyEKF),, он, кажется, компилируется без проблем. Команда компиляции для TinyEKF, которая содержит и использует этот код, выглядит так:

gcc -Wall -I. -I../../src -o gps_ekf gps_ekf.c ../../src/tiny_ekf.c -lm

Он находится внутри /extras/c/ в репозитории и, безусловно, использует функцию unpack.

1 Ответ

1 голос
/ 20 марта 2019

Согласно это , ekf.x имеет тип double x[].Вы не можете просто присвоить массиву, как ekf->x = dptr;, как говорится в ошибке.Если вы хотите скопировать данные из dptr в ekf->x, вы можете использовать memcpy:

memcpy(&ekf->x, dptr, sizeof(ekf->x));

То же самое относится ко всем остальным назначениям, большинство из этих полей - double массивы.

...