【问题标题】:How to write a 6 dimensional array of different sizes? [closed]如何编写不同大小的 6 维数组? [关闭]
【发布时间】:2018-07-13 04:24:39
【问题描述】:

我正在尝试用 c 编写一个结构,将数据存储在这样的链接数组中:

typedef struct
{
    u8 num;
    struct value* next;
}value;

value arr[4] = {
                 {.num = 0, .next = (value[]){
                                              (value){.num = 0, .next = NULL},
                                              (value){.num = 1, .next = NULL},
                                              (value){.num = 31, .next = NULL}
                                             }},
                 {.num = 1, .next = NULL},
                 {.num = 2, .next = NULL},
                 {.num = 31, .next = NULL}
};

将有最多 6 个层次结构级别的链接数组,而不是空值。

如何在 C 中做到这一点?我做错了什么?

顺便说一句,整个结构应该是const,所以我需要用值初始化它,并且在运行时永远不要再碰它。

如果你有办法在 c++ 中做到这一点,我也可以使用它。

【问题讨论】:

  • "如何写出不同大小的六维数组?"如果我不得不处理这个问题,我会先安排咨询心理治疗师。 3 维是我的最大值。
  • 这不是一个多维数组,它是一个基数树或特里树。有大量关于基数树的信息。
  • 您在 struct 类型上似乎缺少标签 value
  • C 还是 C++?这里很重要! C++ 方式将依赖于标准容器链:vector<vector<vector<vector<vector<vector<uint8_t>>>>>>。在 C 中,根据您的具体要求,您可以使用链式指针数组、链式 VLA 指针或链式链表,或者...
  • 编译器告诉你什么?您收到的错误消息是什么?您对错误消息有什么不明白的地方?

标签: c++ c arrays trie


【解决方案1】:

我建议使用 Boost 多维数组。在 C 中,内存管理将很快变得笨拙。见http://www.boost.org/doc/libs/1_63_0/libs/multi_array/doc/user.html

一个更混乱的解决方案是嵌套 std::vectors:

std::vector 等等

【讨论】:

  • a vector<vector<>> 不好,但 6 层嵌套向量是一场噩梦。
  • 是的,这就是我推荐 Boost 多维数组的原因。
  • 你怎么知道这是我的反对票?它不是顺便说一句
  • 很公平,我的错。
  • 我希望它具有内存效率,我想知道我的方法有什么问题,为什么它不能编译?
【解决方案2】:

这里有两个问题:

首先,你的结构没有标签。所以struct value* next; 是一个指向不完整类型的指针。因此,您无法创建它们的数组。您需要将标签添加到您的结构中。

其次,不需要内部数组成员的复合文字语法,因为您已经知道您有一个该类型的数组。此外,因为这会创建单独的对象而不是充当初始化程序,所以会产生错误,因为您在文件范围内有一个对象,其初始化程序不是常量。所以也删除它。

在这些修复之后,你应该有这个:

typedef struct value
{
    u8 num;
    struct value* next;
}value;

value arr[4] = {
                 {.num = 0, .next = (value[]){
                                              {.num = 0, .next = NULL},
                                              {.num = 1, .next = NULL},
                                              {.num = 31, .next = NULL}
                                             }},
                 {.num = 1, .next = NULL},
                 {.num = 2, .next = NULL},
                 {.num = 31, .next = NULL}
};

【讨论】:

  • 太棒了!此外,如果 OP 想要将所有内容设为 const,则需要将 next 成员声明为 const struct value *next(或 struct value const *next),value arr[4] 需要更改为 const value arr[4],而 (value[]){ 将需要更改为(const value[]){
猜你喜欢
  • 2013-06-18
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 2020-05-24
  • 1970-01-01
相关资源
最近更新 更多