首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中初始化相当复杂的char数组?

如何在C中初始化相当复杂的char数组?
EN

Stack Overflow用户
提问于 2008-10-12 18:10:01
回答 6查看 3K关注 0票数 0

假设Visual /C++ 6,我有一个由22399个元素组成的复杂数据结构,如下所示:

代码语言:javascript
复制
{
{ "(SAME", "AS", "U+4E18)", "HILLOCK", "OR", "MOUND"},
{ "TO", "LICK;", {1, 1, 0}, "TASTE,", "A", "MAT,", "BAMBOO", "BARK"},
{ "(J)", "NON-STANDARD", "FORM", "OF", "U+559C", ",", {1, 1, 0}, "LIKE,", "LOVE,", "ENJOY;", {1, 1, 4}, "JOYFUL", "THING"},
{ "(AN", "ANCIENT", {1, 2, 2}, {1, 2, 3}, "U+4E94)", "FIVE"}, 
...
}

宣布这个的最好方法是什么?我试过这样的事情

代码语言:javascript
复制
char * abbrevs3[22399][] = { ... };

代码语言:javascript
复制
char * abbrevs3[22399][][] = { ... };

但汇编中有些慢性问题。

编辑:数据是一个描述某些Unihan字符的数据库。我一直在探索各种压缩数据的方法。目前,您有22399个条目,每个条目可能包含不同数量的字符串,或{缩写标记、最后看到的行、最后看到的行的三元组。

顺便提一下Greg的话,我可能需要让每一行包含相同数量的元素,即使其中一些元素是空字符串。是这样吗?

编辑#2:在我看来,三胞胎中的一些数值远远超出了char的范围。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-10-13 17:49:22

我刚刚读了你的新帖子,重新阅读了原来的文章,我想我已经完全理解了这里的目标。抱歉花了这么长时间,我有点慢。

为了解释这个问题,在原始示例的第4行:

代码语言:javascript
复制
{ "(AN", "ANCIENT", {1, 2, 2}, {1, 2, 3}, "U+4E94)", "FIVE"},

您可能希望将三元组转换为前面使用的字符串的引用,以便压缩数据。这一行变成:

代码语言:javascript
复制
{ "(AN", "ANCIENT", "FORM", "OF", "U+4E94)", "FIVE"},

如果目标是压缩,我不认为你会在这里看到太多的收获。自引用三元组为每个3字节,但要替换的字符串总数只有8字节,计算的是空终止符,而在这一行中只保存了2个字节。那是用来用炭的。由于您的结构太大,需要使用ints作为引用,所以您的三元组实际上是12个字节,甚至更糟。在这种情况下,您只能通过替换12个ascii字符或更多的单词来节省空间。

如果我完全偏离了这里的基础,那么可以随意忽略我,但是我认为在空格上标记,然后删除重复的单词的方法只是一个可怜的人的Huffman压缩。赫夫曼的字母表是一个最长普通子串列表,或者其他一些标准的文本压缩方法可能会很好地解决这个问题。

但是,如果出于某种原因,这不是一种选择,我想我会得到数据中所有唯一单词的列表,并将其用作查找表。然后将所有字符串作为索引列表存储到该表中。您必须使用两个表,但最终它可能会更简单,它将节省您现在用作“缩写标记”的前面1所使用的空间。基本上,您的缩写标记将成为一个单一的索引,而不是三重奏。

所以,

代码语言:javascript
复制
const char * words[] = {
    "hello", "world", "goodbye", "cruel"
    };

const int strings[] = {
    { 0, 1 },
    { 2, 3, 1 }
    };

但是,如果你的字符串长度不是大致一致的话,你仍然会失去很多空间。

票数 2
EN

Stack Overflow用户

发布于 2008-10-12 18:33:34

我将研究如何以XML或其他结构化形式存储数据,然后读取和解析数据,而不是在代码中进行初始化。您在初始化时付出的代价将超过代码易于理解和可维护性的增加。我还会考虑设计一个特定的数据结构来保存每个条目。

编辑下面的示例,尝试复制后续的描述:

代码语言:javascript
复制
enum EntryType { string = 0, triple = 1 };

typedef struct {
   enum EntryType entry_type;
   union {
      char** string;
      int[3] *triple;
   }
} Entry;

typedef struct {
   Entry *entries;
} Abbreviation;

Abbreviation *abbrevs3;

abbrevs3 = parseAbbreviationData("path-to-abbreviations/abbrevs.xml");
票数 4
EN

Stack Overflow用户

发布于 2008-10-12 18:15:57

在C中,您只能在声明数组时省略第一个维度:

代码语言:javascript
复制
char * abbrevs3[][22399] = { ... };

这是因为编译器希望知道每个“行”有多大,以便正确地布局“列”。我把维度放在引号中,因为你可以自由地以任何你想要的方式来解释维度,但这是二维数组的通常惯例。

尽管如此,目前还不清楚您的数据结构实际上是什么,或者您试图初始化它的是什么。您的样本数据似乎没有任何模式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/195794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档