Задать вопрос

Как создать массив из типов данных в си?

Хочу в цикле перебирать типы данных и вычислять их размер, однако столкнулся с проблемой, которая заключается в том, что я не могу использовать тип данных как элемент массива. Подскажите, как реализовать подобную структуру или как обойти данное ограничение. От структуры будет требоваться наличие элементов, которые являются типами данных и индексация элементов.
P.S. пытался реализовать что-то подобное через define, однако, как и ожидалось вместо элемента был подставлен весь диапазон типов данных
  • Вопрос задан
  • 443 просмотра
Подписаться 4 Средний 9 комментариев
Пригласить эксперта
Ответы на вопрос 3
adressmoeistranici
@adressmoeistranici
Делатель
enum typeid { ...}; упоминания типов
индексация упоминаниями ассоциированного массива размеров не лишнее
и конечно явные преобразования данных по месту в switch или через union
Nulltiton, в само перечисление нужно вставить список перечислителей - для области видимости, чтобы их использовать в качестве упоминаний о типе
например назвать enum typeid { int_identity=0, bool_identity, и другие }
каждый чайник знает, а Вы подумали что я предлагаю новую форму синтаксиса с эллипсисом

а в массиве размеров индексация может быть проведена sizes[(size_t)typeid.int_identity]
Ответ написан
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Если массив фиксирован, то можно попробовать через variadic macros это сделать. Но это такой ужас получится. Вам же кроме размеров типов что-то еще делать надо с разными типами. Проще завести enum типов данных, массив из этого, и через switch считать размеры для каждого значения enum.

Edit: был не прав: variadic macro тут не поможет.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Для того чтобы это работало в духе ООП, все типы должны иметь базовый тип.

Для функциональщины - нужно иметь абстрактный тип Any и коллекции типов которые - суть
подтипы Any. И функцию с pattern matching которая просто кастомизирует size() и прочие
функции. Короче почти ручная работа.

Задача интересная и мне кажется что она реально не решаемая в рамках чистого языка С.
Но если использовать кодо-генерацию (транспилляцию) то можно просто как-то автоматизировать создание
такой логики. Но будет ли это языком С или вообще чем-то другим - большой вопрос.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы