Tag: struct

是否有充分的理由说明结构中的指针不允许使用VLA?

这是一种定义Matrix类型的方法 typedef struct { int nr, nc; double *elem; } Matrix; 我想定义一下 typedef struct { int nr, nc; double elem[nr][nc]; } Matrix; 这会很好,因为我不必担心索引。 这就是VLA首先有用的原因,因为它们只能透明地完成索引算法的简单操作。 当然,如果只是因为结构的大小不能很好地定义,上述情况是不可能的。 然后,我仍然会满意: typedef struct { int nr, nc; double (*elem)[nc]; } Matrix; 现在,矩阵数据被存储为指针,就像在非VLA情况下一样。 但算法仍然可以由编译器完成。 该定义仅告诉它是某种指向double数据的指针,其中double精度数以nc为单位排列。 它似乎不允许标准,我想知道为什么,因为通过transtyping很容易做同样的事情。 例如,使用第一个定义(带有double * ),我可以做到 double get(Matrix *a, int i, int j) { int nc = a->nc; […]

位字段及其对齐如何在C编程中起作用?

我需要你帮助理解位域在C编程中的工作原理。 我已经声明了这个结构: struct message { unsigned char first_char : 6; unsigned char second_char : 6; unsigned char third_char : 6; unsigned char fourth_char : 6; unsigned char fifth_char : 6; unsigned char sixth_char : 6; unsigned char seventh_char : 6; unsigned char eigth_char : 6; }__packed message; 我使用sizeof(message)将结构的大小保存为整数。 我认为大小的值将是6,因为6 * 8 = 48位,这是6个字节,但它的大小值为8个字节。 任何人都可以向我解释为什么,以及比特字段和它们的比对是如何工作的? 编辑 […]

迭代c中的结构

我正在编写一个与此代码类似的unit testing,我正在尝试在设置它们时测试我的值,以便我知道发生了什么。 当我运行以下代码时,我不明白为什么ptr值没有设置为1。 相反,当我运行它时,它给我一个10,64,0,0的输出。 任何解释或建议将不胜感激! #include #include typedef struct { bool bOne; bool bTwo; bool bThree; bool bFour; } items; int main() { items item; item.bOne = 0; bool *ptr = &(item.bOne); for(int i = 0; i < sizeof(items)/sizeof(bool); i++) { *ptr = 1; *ptr++; printf("ptr value = %d\n", *ptr); } return 0; }

C中带有typedef结构的未知类型名称

此代码写在名为Monster.c的文件中。 我在GameMain.c文件和Monster.c文件中都定义了Monster.h。 在Monster.h文件中,代码是: #ifdef MONSTER_H_ #define MONSTER_H_ int Monster(int Selection); EnemyStats MonsterStats(int Selection); #endif 然后我在Monster.c文件中创建了我的typedef结构,并创建了函数来返回结构的值。 typedef struct EnemyStats { int EnemyHP; int VictoryExp; int EnemyLevel; } EnemyStats; EnemyStats MonsterStats(int Selection) { struct EnemyStats value; switch(Selection) { case 1: value.EnemyLevel = 1; value.VictoryExp = 1; value.EnemyHP = 1; return value; case 2: value.EnemyLevel = 1; value.VictoryExp […]

如何将Visual Studio中的结构打包到包含uint32_t的24位?

我试图将现有的应用程序从32位ARM微控制器移植到桌面平台,如Microsoft Windows。 GCC用在ARM上,我能够使用32位MinGW编译器在Windows上成功编译应用程序,但是我没有成功使用Microsoft的Visual Studio编译器,这就是我在这里寻求帮助的原因。 这是我的应用程序正在做的事情: 我有一些帧缓冲区,每个像素包含三个字节,所以我的内存看起来像RGBRGBRGB等等。 我在ARM上使用DMA通道将像素推出到显示器,我的显示器直接理解这种内存布局。 我还想节省一些CPU周期,所以我想使用ARM的饱和ADD __UQADD8来绘制我的帧缓冲区,使用单个操作在所有三个通道上执行饱和加法。 为此,我需要在一个整数中使用所有三个通道作为__UQADD8参数。 这就是我为帧缓冲区的一个像素使用联合的原因是通过提供一个包含R,G,B作为uint8_t的结构并提供与24位宽整数标记数据相同的内存来访问单独的通道: union Rgb { struct { uint8_t r; uint8_t g; uint8_t b; } ch; unsigned int data : 24 __attribute__((__packed__)); } 将24位宽度和打包属性添加到数据整数中,以将整数的宽度限制为三个字节。 然后我可以像这样使用像素中的数据: Rgb Rgb::operator+(const Rgb & op) { __UQADD8(data, op.data); return Rgb(data); } 请注意, __UQADD8神奇地只写入我的整数的四个字节中的三个,并且不会改变我的帧缓冲区中下一个RGB的R通道。 以下测试程序certificate我的RGB在使用GCC时都紧凑: #include #include union Rgb { struct { uint8_t […]

是否有一个C预处理器宏来打印结构?

据我所知,没有办法在C中打印出一个struct值。 即,这不会飞: typedef struct { int a; double b; } stype stype a; aa=3; ab=3.4; printf(“%z”, a); 相反,你必须说: printf(“a: %d\n”, aa); printf(“b: %f\n”, ab); 这似乎是一个完美的地方,你可以使用宏来保存任意结构的大量输入。 C预处理器是否足以执行此转换?

stdlib qsort对结构的指针数组进行排序

我试图根据存储在我知道的“桶”结构的void *中存储的值对结构的指针数组(下面的定义)进行排序。 它编译并打印出我的数组桶及其值,没有任何错误或警告,但实际上并没有对数组进行排序。 我使用asserts试图找到任何可能导致qsort错误的地方。 结构定义: typedef struct _bucket{ void* val; char *word; }bucket; typedef struct _root{ bucket **list; int hashTableLength; }root; 要传递给qsort函数的Sort函数: int sortFunc(const void *a, const void *b){ bucket *bucketA=(bucket*)a; bucket *bucketB=(bucket*)b; int bucketAVal = *((int*)bucketA->val); int bucketBVal = *((int*)bucketB->val); assert((bucketAVal&&bucketBVal)!=0); return bucketAVal-bucketBVal; } 对数组进行排序并打印: void sort(root* inRoot, int(*sortFunc)(const void *a, const void *b)){ […]

将typedef与实例声明一起使用。 维基错误?

根据此 Wiki页面,可以编写以下结构: typedef struct my_struct { int integer; } my_struct_t instance; K&R在“C Proglamming Language”中没有提到这一点。 编译器在编译期间也会返回错误: 错误:expected = ; instance之前的, asm或__attribute__ 这是一个Wiki错误还是我做了一些愚蠢的事情?

main()可以返回结构吗?

昨天在采访中有一个问题告诉我, main返回struct ? 我不知道任何人都可以告诉我是否有可能,如果是的话为什么?

如何在使用结构指针时实现gets()或fgets()?

下面的代码与scanf()运行完美,但我想输入字符和空格。 我已经尝试了gets()和fgets() (在下面评论),但它不起作用(它跳转到循环中的下一次迭代并在输出fgets()使用的Name输入期间显示空白(NULL)。 知道怎么做吗? PS:我用样本程序试过fputs() ,工作正常。 但是在使用结构指针时我很困惑。 #include #include struct details { uint Id; char Name[20]; }; int main() { int tot, i; struct details *info; printf(“Enter no. of details to be stored = “); scanf(“%d”, &tot); info = (struct details *)malloc(tot*sizeof(struct details)); for(i=0; iId); printf(“%d)Name = “, i+1); fgets(info->Name, 20, stdin); //How to make […]