C90 — Инициализировать тип агрегата в стеке с неконстантными значениями

#c

Вопрос:

Итак, допустим, я хочу инициализировать новую vec3 структуру для фигуры, которую я хочу отобразить со случайными координатами; в современном C код будет выглядеть примерно так struct vec3 coordinates = { rand_pos(), rand_pos(), rand_pos() }; . Однако это не относится к C90, для инициализации которого требуются константы времени компиляции struct .

Единственное решение, которое я мог придумать, это malloc то struct в куче, инициировать ее членов, и возвратить его разыменовать значение, return *coordinates; однако, поскольку я не возвращая указатель — и я не должен возвращать указатель — это делает API-интерфейс показаться расплывчатым , как мне все еще нужно free то struct позже, но я бы передавая ему адрес , а не указатель на free , которые не соответствуют API для руководства.

Комментарии:

1. почему нет struct vec3 coordinates;' coordinates.x = rand_pos(); coordinates.y = rand_pos(); coordinates.z = rand_pos();

2. @IngoLeonhardt Это сработало?!!!! Как? Почему тогда моя реализация не сработала? Что на самом деле компилятор имеет в виду под «агрегатным типом», не могли бы вы объяснить мне проблему? Опубликуйте свой ответ, кстати, я хочу отметить этот вопрос как отвеченный.

3. Я опубликовал это в качестве ответа. Извините, но я ничего не могу сказать об ошибке компилятора, так как вы не опубликовали полное сообщение. Но вы не должны путать инициализацию и назначение

4. Ваш способ не работает, потому что вы используете инициализацию переменных, для которой требуются константы времени компиляции. Рабочее решение определяет переменную без инициализации, а затем присваивает значения каждому элементу. Для назначений константа не требуется.

Ответ №1:

Ничто не мешает вам определить struct без инициализации (или с константами времени компиляции) и присвоить желаемые значения впоследствии. Инициализация и назначение не одно и то же, поэтому любой компилятор примет это

 struct vec3 coordinates;
coordinates.x = rand_pos(); 
coordinates.y = rand_pos(); 
coordinates.z = rand_pos();

return coordinates;