Алгебраический тип данных, эквивалентный в C - PullRequest
7 голосов
/ 30 августа 2010

Я пишу программу, которая читает поток данных и разбирает его на несколько значений: целые числа, числа с плавающей запятой, символы или составное значение, которое содержит набор значений (может быть вложенным).Как я мог представить это в C?Я думал о объединении int, float, char, а затем о массиве указателей на такие объединения для составного значения, но он не может быть вложенным.

Ответы [ 2 ]

4 голосов
/ 30 августа 2010

(я представляю, что вы анализируете файл XML)

Предположим, у вас есть несколько узлов.Каждый узел может иметь значение, он может быть одним из набора элементов одного уровня и иметь детей.Это даст вам такую ​​структуру:

 struct Node
 {
       DATA Value;
       DATATYPE  Type;
       Node* nextSibling;
       Node* firstChild;
 };

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

1 голос
/ 30 августа 2010

Вы имеете в виду char, а не char[]? Все значения символов могут быть сохранены в int. В связи с этим, можно с уверенностью сказать, что все значения int, которые вы хотите (и все возможные значения int на вашем компьютере), могут быть точно представлены как double.

Итак, я рекомендую древовидную структуру с double полезными нагрузками в узлах. Используйте enum, чтобы различать тип, если это необходимо. Вы можете представить n-арное дерево, используя единственный дочерний указатель и один указатель «следующий» из связанного списка… В Википедии где-то есть диаграмма, но я не могу ее найти: v (.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...