Инициализировать struct varargs - PullRequest
0 голосов
/ 04 мая 2020

Я хочу заполнить всю структуру в varargs. Я знаю, что все отдельные элементы структуры могут быть заполнены int16_t *x = va_arg(args, int16_t*); Но я ищу более эффективный способ, чтобы я мог использовать memset. Я попытался использовать тот же код для всей структуры, как показано ниже. Но это не работает. Так есть ли способ инициализировать всю структуру только с одним аргументом va_args вместо varargs для всех отдельных элементов.

typedef struct {
    int16_t x;          
    int16_t y;      
} Coordinate;

void AddValues(int count, ...) {
    va_list args;
    va_start(args, count);

    Coordinate *dec = va_arg(args, Coordinate*);
    *dec.x = 10;
    *dec.y = 5;
    va_end(args);
}

int main() {
    Coordinate cor;
    AddValues(2, &cor);
    printf("x: %d and y: %d\n", cor.x, cor.y);
}

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

va_arg(args, Coordinate) должно быть va_arg(args, Coordinate *).

Вы можете назначить всю структуру с помощью составного литерала :

*va_arg(args, Coordinate *) = (Coordinate) { 10, 5 };

void main() должно быть int main(void).

1 голос
/ 04 мая 2020

Совершенно законно использовать тип структуры с макросом va_arg. Требование заключается в том, что

Тип параметра должен иметь имя type , указанное таким образом, чтобы тип указателя на объект, имеющий указанный тип, можно было получить простым постфиксом * до тип .

Результат вызова va_arg относится к этому типу, не - указатель на тип. Вы присваиваете значение типа Coordinate для dec, которое имеет тип Coordinate*. Исправьте это и откорректируйте остальной код соответствующим образом, и вы сможете заставить его работать.

Также:

void main() неверно. Используйте int main(void).

В коде вашего вопроса отсутствуют как минимум три обязательные директивы #include.

Ваш код определяет AddValues, но вызывает AddValuesOriginal.

Если вы скажете нам «Но это не работает», вам нужно показать нам точно , как это не работает. Включите любые сообщения об ошибках в свой вопрос, отформатированные в виде кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...