Проблема в том, что элемент подменю является членом объединения, поэтому его необходимо определить до объединения.
blockquote>Да.
Но у него есть указатель на массив экземпляров этого объединения, что вызывает ошибку компиляции, потому что объединение еще не определено.
blockquote>Для объявления указателя на этот тип необязательно указывать объединение. Это должно быть только объявлено . Определение может прийти позже.
Существует ли типобезопасный способ справиться с этим, или мой указатель в записи подменю должен быть пустым *?
blockquote>Да. Форвард-объявлять объединение перед определением структуры, а потом помещать определение объединения. Это требует от вас предоставления тега для вашего типа объединения, иначе прямое объявление и последующее определение не будут ссылаться на тот же тип.
Пример:
typedef union entry tuEntry; typedef struct { // ... tuEntry *entries[]; } ts_EntrySubmenu; union entry { // ... ts_EntrySubmenu entrySubmenu; };
Кроме того, я не могу не заметить, что ваш исходный код полностью избегает объявления каких-либо тегов структуры или объединения. Я хочу убедиться, что вы понимаете, что это выбор стиля , и особенно, что ключевое слово
typedef
предназначено не для определения типов, а для объявления псевдонимов для имен типов. Ваш стиль по своей сути не ошибочен, но он не поддерживает то, что вы хотите сделать. Вам нужно использовать типы структуры и объединения с тегами, чтобы связать несколько объявлений одного и того же типа в одной и той же области видимости.
Я аэрокосмический инженер; Я использую кватернионы для управления ориентацией космического корабля и навигации уже три десятилетия. Вот несколько мыслей о вашей ситуации:
У меня есть алгоритмы для всех этих операций и многого другого: кватернионы в / из углов Эйлера любой последовательности вращения в / из матриц вращения (матрицы направляющих косинусов) , кватернионная интерполяция, согласование положения, скорости и т. д. в конечных или промежуточных точках, динамика и кинематика жесткого и гибкого тела с использованием кватернионов.
Пожалуйста, свяжитесь со мной, если я могу быть полезен в nhughes1ster@gmail.com
Я фанат кватернионов. Не могли бы вы пересмотреть свою презентацию пользователю, чтобы заставить их работать? Вместо того, чтобы представлять вращение пользователю как серию углов Эйлера в текстовой форме, вы могли бы вместо этого выбрать какой-нибудь простой трехмерный объект и применить к нему вращение кватерниона, чтобы визуально отобразить действующее вращение.
Почему бы не использовать в коде кватернионы и не преобразовать Q в углы, когда это необходимо для отображения?
Вы можете представить вращение как ось + угол поворота, что по сути то же, что и кватернион (до знак)
Я не думаю, что имеет смысл использовать углы Эйлера внутри - вы захотите использовать кватернионы для всех своих вычислений и обычно не сможете позволить себе преобразования, происходящие повсюду. Что касается преобразования его обратно в углы Эйлера для пользовательского интерфейса - будет ли это так плохо, если пользователь получит только угол, эквивалентный исходному вводу, но представленный по-другому? Если вы выполните преобразование правильно, вы должны получить «простейшие» углы Эйлера для любого данного кватерниона.
О скольких конверсиях идет речь. Похоже, вы платите примерно за две трансцендентные операции за преобразование, которые на современном оборудовании доступны со скоростью порядка 100 миллионов в секунду. Я бы сохранил оба, Quaternions для точности и эстетики и вращения Эйлера для сохранения информации о пользователе. Может быть, добавить флаг, чтобы указать, что предпочтительнее для любого данного объекта. Вдобавок к этому вам нужно выполнить преобразование только один раз для каждого повернутого элемента. После того, как вы вычислили матрицу преобразования, ее умножение-складывание, пока у вас не закончатся вершины.