gpt4 book ai didi

c - 访问另一个 typedef 结构中的 typedef 结构

转载 作者:太空宇宙 更新时间:2023-11-04 06:18:33 25 4
gpt4 key购买 nike

请参阅下面给出的片段。我们如何使用 struct storagestruct sample 访问 descrptn

typedef struct {
char hex;
char descrptn[50];
}TypeText;

typedef struct {
int val;
TypeText test[10];
}TypePara;

static const TypeText sample[]={
{0x00, "Low"},
{0x7F, "Mid"},
{0xFF, "HIgh"},
};

const TypePara storage[]= {
{0, sample},
{1, sample}
};

最佳答案

您的问题我们如何使用结构存储从结构样本中访问描述?在下面更正代码的主要功能中得到解决,但由于对形状的一些不正确假设你的复合结构,它可能看起来不像你想象的那样。

首先需要解决一些语法错误和错误假设。

1) - 注意:因为您正在将常量表达式的元素初始化为 0xFF,即使它在初始化程序中的对齐应该将其标识为 signed char,根据您的编译器及其设置,它可能会假定为 unsigned char 并发出溢出警告。 (这正是我的系统上发生的事情)。因为该值实际上与 signed char 对齐,所以在运行时不应发生溢出。
2) - 你有一个 struct 数组。虽然简单的数组可以用变量初始化( Variable Length Array 概念自 C99 以来一直有效。),struct 只能用常量值初始化。因为您的代码尝试使用变量初始化结构 (sample),所以它应该无法编译。
3) - 结构初始化器的形状必须与其正在初始化的结构的形状匹配,包括初始化器位置和类型。因为 TypePara 是一个复合结构(一个包含结构成员的结构),所以它的初始化程序必须考虑到这一点。 const TypePara storage[] ={...} 的初始值设定项的形状不正确。

前两项应该用编译时消息为您清楚地标记。确保您的编译器设置为可以看到它们。

不幸的是,第三项并不总是显示为错误或警告。 C有时会让你做一些不一定正确的事情。

其中的每一个都在下面的语法和注释中得到解决。

使用您的 struct 定义,并进行以下指示的更改,您可以像这样访问 descrptn:(以下是对您的原始帖子的完整和可编译改编)

typedef struct {   //Note:                                             
char hex; //Initializer for TypeText shaped like this:
char descrptn[50]; //hex description
}TypeText; //{0x01, "one"};

typedef struct { //Note: TypePara is a struct containing an array of struct
int val; //Initializer for each instance of TypePara shaped like this:
TypeText test[10]; //val TypeText[0] TypeText[1] TypeText[9]
}TypePara; //{1, {0x01, "one"},{0x02, "two"}...{0x0A, "Ten"}};

static const TypeText sample[]={

{0x00, "Low"},
{0x49, "Mid"},
//{0xFF, "HIgh"} //commented and replaced to
{0x7F, "High"} //prevent possible overflow condition
};

//const TypePara storage[]= {
// {0, sample}, //error, "sample is not a compile time constant
// {1, sample}
//};

//Note: illustrates shape only. Values are otherwise meaningless
const TypePara storage[] = {
{ 0,{{0x00, "zero"},{0x01, "one"},{0x02, "two"},{0x03, "three"},{0x04, "four"},{0x05, "five"},{0x06, "six"},{0x07, "seven"},{0x08, "eight"},{0x09, "nine"}}},
{ 1,{{0x01, "zero"},{0x11, "one"},{0x12, "two"},{0x13, "three"},{0x14, "four"},{0x15, "five"},{0x16, "six"},{0x17, "seven"},{0x18, "eight"},{0x19, "nine"}}},
{ 2,{{0x02, "zero"},{0x21, "one"},{0x22, "two"},{0x23, "three"},{0x24, "four"},{0x25, "five"},{0x26, "six"},{0x27, "seven"},{0x28, "eight"},{0x29, "nine"}}},
{ 3,{{0x03, "zero"},{0x31, "one"},{0x32, "two"},{0x33, "three"},{0x34, "four"},{0x35, "five"},{0x36, "six"},{0x37, "seven"},{0x38, "eight"},{0x39, "nine"}}},
{ 4,{{0x04, "zero"},{0x41, "one"},{0x42, "two"},{0x43, "three"},{0x44, "four"},{0x45, "five"},{0x46, "six"},{0x47, "seven"},{0x48, "eight"},{0x49, "nine"}}}
};


int main(void)
{
//Accessing descrptn
printf( "descrptn is %s\n", storage[0].test[0].descrptn);
printf( "descrptn is %s\n", storage[0].test[1].descrptn);
printf( "descrptn is %s\n", storage[0].test[2].descrptn);
printf( "descrptn is %s\n", storage[0].test[3].descrptn);
//...
//This can continue as you have 5 storage elements
//defined, each of those containing 10 test elements.

return 0;
}

关于c - 访问另一个 typedef 结构中的 typedef 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40291778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com