Как передать массив указателей на структуры в функцию? - PullRequest
0 голосов
/ 05 ноября 2018

Рассмотрим структуру, которая представляет точку в декартовой координате.

struct point { float x, y; };
typedef struct point point_t;

У меня есть функция, которая берет группу точек и рисует кривую на основе пройденных точек, чье определение выглядит следующим образом:

void beziercurve(int smoothness, size_t n, point_t** points)

Я написал функцию bezier и хочу проверить, правильно ли работает моя функция. Итак, внутри основной функции я передал следующие фиктивные значения в функцию через составные литералы,

point_t **p={(point_t*){.x=1.0, .y=1.0},
             (point_t*){.x=2.0, .y=2.0},
             (point_t*){.x=4.0, .y=4.0}};
beziercurve(100, 3, p);

LLVM выдает мне следующую ошибку,

bezier.c:54:44: error: designator in initializer for scalar type 'point_t *'
  (aka 'struct point *')
    point_t** p=(point_t**){(point_t*){.x=1.0,.y=1.0},(point_t*){.x=2.0,.y=2.0...
                                       ^~~~~~

Я даже попробовал что-то подобное,

point_t **p={[0]=(point_t*){.x=1.0, .y=1.0},
             [1]=(point_t*){.x=2.0, .y=2.0},
             [2]=(point_t*){.x=4.0, .y=4.0}};
beziercurve(100, 3, p);

Но это тоже не работает. Моя логика выглядит следующим образом: (point_t*){.x=1.0, .y=1.0} создает указатель на временную структуру, а набор этих указателей структуры внутри волнистых скобок создает массив тех указателей, которые я могу передать функции.

Чего мне не хватает? Почему код не работает?

1 Ответ

0 голосов
/ 05 ноября 2018

Этот составной литерал не работает:

(point_t*){.x=1.0, .y=1.0}

Потому что он пытается сказать, что инициализатор {.x=1.0, .y=1.0} является указателем, но это не так.

Чтобы создать массив указателей на структуры, вам нужно сделать следующее:

point_t *p[]={&(point_t){.x=1.0, .y=1.0},
             &(point_t){.x=2.0, .y=2.0},
             &(point_t){.x=4.0, .y=4.0}};

Тем не менее, я подозреваю, что вам действительно нужно - это просто массив структур. Вы можете создать его так:

point_t p[] = {
    {.x=1.0, .y=1.0},
    {.x=2.0, .y=2.0},
    {.x=4.0, .y=4.0}
};

Тогда вы изменили бы свою функцию, чтобы указатель указывал на point_t:

void beziercurve(int smoothness, size_t n, point_t *points)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...