#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;