Tag: 工会

带联合的二进制表示

在以下程序中: union { int i; float f; } u; 假设32位编译器, u在内存中分配4个字节。 uf = 3.14159f; 3.14159f使用IEEE 754表示,在这4个字节中。 printf(“As integer: %08x\n”, ui); 你在这里代表什么? IEEE 754二进制表示是否被解释为4字节signed int ?

Arduino:无法通过gcc编译器将union struct作为指针交流传递

我正在尝试使用Arduino结构但不能通过函数调用传递结构指针。 添加主要function并使用gcc为我的计算机编译时,一切正常,但使用Arduino IDE,我得到错误。 我试过的代码是: typedef union { struct { unsigned unit :2; unsigned channel:2; unsigned status :1; unsigned group :1; unsigned remote :26; }; unsigned long data; } Signal; Signal signal; void testPassingStruct(Signal *variable) { variable->status = 1; } void setup() { signal.status = 1; testPassingStruct(&signal); } void loop() { } 错误是: structtest:2: error: variable […]

以不同类型访问数组成员的正确方法?

我有uint16_t 。 它的大部分成员都是uint16_t ,但有些是int16_t ,有些是uint8_t 。 你会怎么处理? 顺便说一句,我试过: 指针: 使用2个指针,一个int16_t*和另一个uint8_t* ,都初始化为数组的开头,以访问int16_t和uint8_t数组的成员。 (最初有效,但是我在程序后期遇到了一些问题,其他东西改变了指针的值,所以我不相信它。) 使用union进行类型定义。 在file.h中: typedef union { uint16_t u16[NO_OF_WORDS]; // As uint16_t int16_t s16[NO_OF_WORDS]; // As int16_t uint8_t u8[2 * NO_OF_WORDS]; // As uint8_t } ram_params_t; extern ram_params_t ram_params[]; 在file.c中: ram_params_t ram_params[] = {0}; (那真的很轰炸。) 铸件。 (我没有那么远。)

输入punning Vs Union成员访问权限

根据这个https://stackoverflow.com/a/1812932/1814023 writing one member of union and reading another member is undefined behavior. 并且根据这个https://stackoverflow.com/a/11640603/1814023 type punning is allowed in C99 / C11 我对这两个post感到有点困惑,哪一个是正确的? 需要帮助理解类型惩罚Vs访问union的成员。 谢谢。

使用C语言中的结构联合

说我有以下类型: typedef struct TYPEA { int type; char[12] id; } TYPEA; typedef struct TYPEB { int type; int value; } TYPEB; 我想使用创建这些类型和’int’的联合,这样我就可以访问“type”int而无需知道TYPEA或TYPEB是否存储在union中(int的值让我确定哪个实际存储了那里)。 虽然我无法获得正确的语法。 我的工会: typedef union MEMBER { int type; struct TYPEA a; struct TYPEB b; } MEMBER; 通过以下方式访问联盟: typedef struct WRAPPER { union MEMBER* member; struct WRAPPER* next; } WRAPPER; 问题: (使用’w’作为指向已分配的WRAPPER结构的指针)使用w->member->a.id访问,在不是结构或联合的情况下给出“成员’id’的请求。 我可以直接将指向已经malloc的TYPEA / […]

检查联合实例之间的相等性的正确方法是什么?

我有一个multithreading应用程序,它将数据存储为以下联合的实例数组 union unMember { float fData; unsigned int uiData; }; 存储此数组的对象知道联合中的数据是什么类型,因此在检索正确类型时我不会遇到UB问题。 但是在程序的其他部分,我需要测试这两个联合实例之间的相等性,并且在这部分代码中,真正的内部数据类型是未知的。 结果是我无法使用这种方法测试联合的相等性 unMember un1; unMember un2; if (un1 == un2) { // do stuff } 因为我得到编译错误。 因此,我只是比较联合的浮动部分 if (un1.fData == un2.fData) { // compiles but is it valid? } 现在考虑到我已经读过它是UB访问一个联盟的任何部分,而不是最后写的那部分(这是繁琐的写,但我可以想到没有更明确的方式来说这个)我想知道代码是否以上是检查我的联合实例的相等性的有效方法? 这让我意识到内部我不知道工会是如何运作的。 我假设数据只是存储为一个位模式,你可以根据你所喜欢的方式解释它,具体取决于联合中列出的类型。 如果不是这种情况,那么测试两个联合实例的相等性的安全/正确方法是什么? 最后,我的应用程序是用C ++编写的,但我意识到工会也是C的一部分,所以两种语言如何对待它们有什么不同?

C:typedef union

在相关问题中找不到任何相关内容。 最有可能的是它的超级菜鸟,但无论如何我都会问/我的.h文件中有以下内容: typedef union _API_Packet_0x90{ uint8_t packet[26]; struct _pack_struct { uint8_t start; uint8_t length[2]; uint8_t addr64[8]; uint8_t addr16[2]; uint8_t options; uint8_t rfData[4]; uint8_t chksum; }; } API_Packet_0x90; API_Packet_0x90 ap90; 这是微控制器的代码,我使用的是xc8工具链(以前的Hi Tech C)。 编译器说: xbee_api.h:19:警告:缺少基本类型; int假设 xbee_api.h:19:错误:“;” 预期 xbee_api.h:19:警告:缺少基本类型; int假设 xbee_api.h:21:警告:缺少基本类型; int假设 ,这继续(错误太多) 我认为这是uint8_t,所以我添加了#include 。 不。 我以为这是关于名字的,所以我尝试了各种各样的戏剧,比如 typedef union { uint8_t packet[26]; struct _pack_struct { }; […]

ANSI C联合 – 它们真的有用吗?

从昨天对某些问题的回答中,我了解到写入一个联盟成员并从另一个不同类型的成员中读取值是不可移植和不安全的,假设成员的基础对齐。 所以在经过一些研究之后,我发现了一个重复这个主张的书面来源并指定了一个流行的例子 – 使用int和float的并集来查找float的二进制表示。 因此,我想知道这个假设并不安全,我想 – 除了节省记忆(呃……)对工会有什么实际用途? 注意:即,在标准C下。显然,对于特定实现,规则是事先已知的并且可以被利用。 编辑:“不安全”这个词,由于近年来的联想,可能是一个不好的措辞选择,但我认为意图明确。 编辑2:由于这一点在答案中重复 – 节省内存是一个有效的参数。 我想知道是否还有其他的东西。

通过union未定义的行为进行const-casting?

与C ++不同,C没有const_cast概念。 也就是说,没有有效的方法将const限定指针转换为非限定指针: void const * p; void * q = p; // not good 首先:这个演员实际上是未定义的行为吗? 无论如何,GCC警告这一点。 要制作需要const-cast的“干净”代码(即我可以保证我不会改变内容,但我所拥有的只是一个可变指针),我看到了以下“转换”技巧: typedef union constcaster_ { void * mp; void const * cp; } constcaster; 用法: u.cp = p; q = u.mp; u.cp = p; q = u.mp; 。 通过这种联盟抛弃常量的C语言规则是什么? 我对C的了解只是非常不完整,但我听说C对联合访问比C ++要宽松得多,所以虽然我对这个结构有一种不好的感觉,但我想从标准中得到一个论证(C99我想,虽然如果在C11中这已经改变了,那么知道它会很好。

C – 使用union,分配内存

我有一个看起来像这样的C结构 typedef struct event_queue{ Event* event; int size; int front; int count; int delay; } event_queue; 这是一个基本的循环队列。 事件值是一个EventPointers数组,每X次遍历一次以使其中一个事件出列。 它被初始化为 p->event = calloc(p->size, sizeof(Event)); 事实上,我想做一个具有类似function的类似队列来排队其他类型的类似事件,但数据略有不同。 最初我只是想拥有单独的队列并分别遍历它们,但function如此重复,似乎我只是做错了。 想象一下,“姐妹”队列完全相同,但指向“事件”的不同类型。 我应该使用联盟吗? 如 typedef struct event_queue{ union{ Event* event; VisualEvent* visual; } data; unsigned char* datatype; //array of same size as data for every individual member int size; int front; […]