C、 多维不等数组

C、 多维不等数组,c,C,我想在C面上申报类似的东西 const unsigned char test[][][][] = {{0x22,0x33},{0x22,0x33,0x44},{0x22,0x33,0x44,0x55},{0x22,0x33,0x45}}; 但这是无效的。我寻求一种优雅的方法来存储4个可以通过索引寻址的数组,但它们的大小不一样,因为它们包含一些到设备的RS232命令 我正在寻找命令[初始化],命令[重置]等等 非常感谢您的建议 这应该有效: const unsigned char test[][

我想在C面上申报类似的东西

const unsigned char test[][][][] = {{0x22,0x33},{0x22,0x33,0x44},{0x22,0x33,0x44,0x55},{0x22,0x33,0x45}};
但这是无效的。我寻求一种优雅的方法来存储4个可以通过索引寻址的数组,但它们的大小不一样,因为它们包含一些到设备的RS232命令

我正在寻找命令[初始化],命令[重置]等等

非常感谢您的建议

这应该有效:

const unsigned char test[][4] = {{0x22,0x33},{0x22,0x33,0x44},{0x22,0x33,0x44,0x55},{0x22,0x33,0x45}};

一般来说,不能在单个变量声明中执行此操作。我的建议是这样的:

const unsigned char command1[] = {0x2, 0x3, 0x0};
const unsigned char command2[] = {0x3, 0x0};
const unsigned char *commands[] = {command1, command2};
注意,每个命令都有一个
0x0
-终止符;这是必需的,因为否则将无法知道命令字符串中有多少字节

如果您碰巧知道命令的最大长度,则可以执行以下操作:

const unsigned char commands[][MAX_LENGTH+1] = {
   {0x2, 0x3},
   {0x3},
};
这同样允许您通过查找
0x0
来了解命令的长度。请注意,这将浪费空间,因为每个非最大长度的命令都有额外的零字节


此答案假定
0x0
不是有效的命令字节。如果是,则需要分别存储每个命令的长度。

选择最大范围并保留不需要的元素不设置?只需将它们存储为字符串数组:
const unsigned char*test[]={AB”,“ABC”,“ABCD”,“…}
。我的意思是,您可以将每个数据部分终止为零(或其他不在数据中的符号)。非常感谢大家的宝贵意见,其中4不是此数组中的元素数,而是子数组中的最大元素数。然而,我想看看你们如何知道每一个元素实际上包含多少个元素……这是不可能的。如果数组太小,您应该得到一个编译器警告。您或者需要单独的计数器,或者每个数组中都有一个前哨值来知道它的结束位置。@nickie:如果数据不能包含零字节,那么您可以用0x00终止每个初始值设定项以指示结束。使用字符串,您可以编写
const unsigned char*test[]={“\x22\x33”、“\x22\x33\x44”、“\x22\x33\x44\x55”、“\x22\x33\x45”}
获取以null结尾的字符串-以每个条目一个指针为代价。如果命令的长度都小于8字节,那么最好使用2D数组(
unsigned char test[][8]
)和一组类似于我给出的初始值设定项或括号中的等效项。@nickie:没错。我根本没有考虑潜在的问题——只是看到了代码。