【问题标题】:Algebraic data type equivalent in CC中等效的代数数据类型
【发布时间】:2011-04-05 22:26:36
【问题描述】:

我正在编写一个程序,它读取数据流并将其解析为一些值:整数、浮点数、字符或包含一组值(可以嵌套)的复合值。我怎么能用 C 来表示呢?我在想intfloatchar 的联合,然后有一个指向此类联合的指针数组作为复合值,但不能嵌套。

【问题讨论】:

  • 简答 - 不要在 C 中尝试这个 :)
  • 你打算如何处理这个数据流?
  • 你可以包含一个指向下一个联合实例的指针来存储一个值列表。
  • @Pmod:处理并写入文件。 (流本身就是一个二进制文件。)而且我已经编写了一个版本,可以直接写入数据而不存储数据,但这会使处理变得笨拙。
  • @Hamish:越想越倾向于Haskell。

标签: c types


【解决方案1】:

(我在想象你正在解析一个 Xml 文件)

我们假设您有一堆节点。每个节点都可以有一个值,它可以是一组兄弟节点中的一个,并且它可以有子节点。这会给你一个像这样的结构:

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

DATA 可以是您描述的联合体,也可以是单独的变量。但是,由于您将以与存储它们相同的形式从中读取值,因此联合应该没问题。 DATATYPE 应该是一个枚举。

【讨论】:

    【解决方案2】:

    您的意思是char 而不是char[]?所有 char 值都可以存储在 int 中。就此而言,可以肯定的是,您想要的所有int 值(以及您机器上所有可能的int 值)都可以完全由double 表示。

    因此,我建议在节点中使用带有double 有效负载的树结构。如有必要,使用enum 区分类型。您可以使用单个子指针和单个链表“下一个”指针来表示 n 叉树…… Wikipedia 在某处有一个图表,但我找不到它:v( .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多