LINUX.ORG.RU

Структуры условного выбора типа

 , ,


0

3

У меня возникла идея структуры условного выбора типа.

struct{
int selector_of_type;
void * data_of_selected_type;
}

То есть, это структура последовательности из «выбирающего» и «выбираемого» типа. От значения выбирающего типа зависит тип выбираемого. Было б очень удобно для хранения данных, передачи через сеть итп.

В сишном стандарте этого нет, есть ли в библиотеках типа glib? Хочу знать не изобретаю ли я уже изобретенное?


Изобретаешь, но в этом нет ничего плохого, удобно и практично если с умом делать, вот пример https://github.com/orangeduck/Corange/blob/master/include/casset.h, для статики можно поступить иначе и сунуть в структуру юнион в который сунуть другие структуры и в шапке указывать хранимый тип по id

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Тип-сумма. Еще есть тип-произведение. И вообще, есть алгебраические типы данных.

anonymous
()
Ответ на: комментарий от anonymous

Что за бред? Вы функции перечисляете или типы? Или вообще про методы из ООП-языка, а не Си?

metaprog
() автор топика
Ответ на: комментарий от metaprog

Я в курсе, это просто каст к воиду и обратно при заборе данных, юзай и радуйся, используется это часто. Весь вопрос как для для себя это реализуешь. Ссылку я тебе дал, там рабочий пример, много типов все приводятся в void * и указатели складываются в хранилище, доступ к ним по именам, к примеру


entity_new("player",static_object);
entity_new("world",landscape);


static_object  *s = entity_get("player");
landscape      *l = entity_get("world");



А по ссылке тоже что и у тебя

//структура для хранения данных загруженных файлов
typedef struct {
  fpath path; // путь до файла оно же имя для данных
  asset* ptr; // структура данных файла напимер музыка или 3d объект скастованная в void *
  uint32_t timestamp; // время, опционально
} asset_hndl;

тут в хранилище поиск имени по fpath path и отдаётся ptr через макрос который кастует тип обратно

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

Тип-сумма. Еще есть тип-произведение. И вообще, есть алгебраические типы данных.

Так обломали автора. Он думал, что прорыв в информатике совершил, а тут такое...

anonymous
()
Ответ на: комментарий от anonymous

Когда поймет, тогда и будет облом. А до тех пор пусть наслаждается своей гениальностью.

anonymous
()

В качестве другого примера можно глянуть на семейство
struct sockaddr

bormant ★★★★★
()
Ответ на: комментарий от metaprog

Владимир

QT - огромная вселенная /а может быть даже «черна дыра»/.
Классы для отрисовки примитивов, ... местами а-ля WIN API.

anonymous
()
Ответ на: комментарий от metaprog

У тебя просто своего мнения нет, всё на других киваешь. Но ты не Линус, вот в чем штука.

// Эх, tailgunner исчез, некому пояснить за cat-v.org

anonymous
()
Ответ на: комментарий от metaprog

Владимир

Ни к тому это было сказано, что это плохо.

anonymous
()
Ответ на: комментарий от metaprog

язабан. очевидно, чья-то мартышка добралась до клавиатуры.

anonymous
()
Ответ на: комментарий от metaprog

Писать на Си есть смысл только в том случае, если ты собираешься коммитить свой код в ядро.

Deleted
()
Ответ на: комментарий от metaprog

Потому что возникают идиотские проблемы, подобные твоей. В более высокоуровневых языках многократно решённые.

Deleted
()
Ответ на: комментарий от Deleted

идиотские проблемы

А где ты здесь вообще проблему увидел?

Deleted
()

struct {
int selector_of_type;
void * data_of_selected_type;
};

Недостаточно эффективно. Прикольней было б, если бы у вас возникла идея похожей структуры, но которая вся могла бы разместиться в одном непрерывном куске памяти, в том числе на стеке.

Sorcerer ★★★★★
()
Ответ на: комментарий от metaprog

На C это будет выглядеть как-то так:

struct WebEvent {
    unsigned char discriminant;
    union {
        // discriminant == 0
        struct {} page_load;
        // discriminant == 1
        struct {} page_unload;
        // discriminant == 2
        struct {
            char key;
        } key_press;
        // discriminant == 3
        struct {
            char* buffer;
        } paste;
        // discriminant == 4
        struct {
            int x;
            int y;
        } click;
    };
};
anonymous
()
Ответ на: комментарий от i-rinat

A GVariant cannot contain a pointer. Отметается.

https://developer.gnome.org/glib/stable/glib-GVariant.html

Надо уметь и указатели вмещать, и структуры с указателями. При сериализации/десериализации будут читаться/писаться данные из указателя/в указатель. Кстати, в Метапроге массив - это структура из указателя и длины массива.

metaprog
() автор топика
Ответ на: комментарий от metaprog

Надо уметь и указатели вмещать, и структуры с указателями. При сериализации/десериализации будут читаться/писаться данные из указателя/в указатель.

В итоге ты переизобретёшь GVariant или его подмножество. Ничего плохого в этом нет, особенно если хочешь время потратить.

i-rinat ★★★★★
()

У меня нету скора для написания комментариев в ту тему, скоро наберется, а пока писать туда не могу.

Deleted
()
Ответ на: комментарий от metaprog

Наверное автоматом закрывается после 1к комментариев в теме, ну можно сделать чатик какой нибудь, и туда перейти. Главное что бы без регистрации...

Deleted
()

Ты зависимые типы захотел что ли?

В маломальски безопасном ключе это не сделать в сишке, да и ненужно.

Тебе нужен либо класс с методами, либо параметрический контейнер в 99% случаев. Оборачивать тип в контейнер с тагом в сишке безопасно не получится, так что я бы даже не пробовал. В окамле, расте или крестах еще можно.

Freyr69 ★★★
()
Ответ на: комментарий от metaprog

Ну мне видятся такие варианты...

  • Создать новую тему.
  • Уйти на другой форум.
  • Купить хостинг за 50 рублей у ihor.ru и поставить туда чат.
Deleted
()
Ответ на: комментарий от Deleted

Ладно, помозгую. А пока пора валить.

metaprog
() автор топика
Ответ на: комментарий от iluha16

Нет. Идея в универсальной модели сериализации/десериализации данных любого типа в текст (для хранения в файлах, передачи через сеть и не только).

metaprog
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.