Tag: 联合

将各个位分配给字节

我需要在微控制器和另一个芯片之间进行SPI通信。 该芯片接受16位字。 但是抽象库需要将数据作为两个8位字节发送。 现在我想制作一个包装器,这样我就可以轻松创建读写请求……但我还没有取得任何成功。 这是它应该如何: 下表显示了16位。 MSB可以是0表示写入, 1表示读取。 地址可以是0x0到0x7 ,数据是11位。 R/W | ADDRESS | DATA B15 | B14-B11 | B10-B0 0 | 0000 | 00000000000 W0 | A3, A2, A1, A0 | D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0 例如,如果我想从寄存器0x1读取,我想我必须设置这样的位: W0 | A3, A2, A1, A0 | D10, D9, D8, D7, […]

如何创建一个快速和巨大的联合数组而不浪费C中的内存?

我想使用union将不同的数据类型存储在同一个内存中。 该arrays具有固定长度,应快速访问,并尽可能少浪费内存。 我将定义存储相同数据类型的区域。 所以我这样做: #include #include #include #include #define RESERVED_BYTES 1073741824 //#define RESERVED_BYTES 2147483648 typedef union { char c[RESERVED_BYTES]; //1Byte uint8_t u8[RESERVED_BYTES]; //1Byte uint16_t u16[RESERVED_BYTES / 2]; //2Byte } array_type; int main(void) { array_type *array; array = calloc(1, sizeof(array_type)); getchar(); return 0; } 这段代码工作并分配1GB内存,该数组的元素可以与array[0].u8[3]例如我知道我必须处理索引,因为它们依赖于字节大小。 遗憾的是,如果我增加内存大小(参见#define RESERVED_BYTES 2147483648 )并且在64位计算机上使用MSVS 2013,则代码无法编译我收到error C2148: total size of array must […]

为什么这个联合正在删除c代码中数组中的第一条记录?

这是我的一个头文件,它由一个包含4种不同结构的联合模板组成。 #define MAX 3 union family { struct name /*for taking the name and gender of original member*/ { unsigned char *namess; unsigned int gender; union family *ptr_ancestor; /*this is a pointer to his ancestors details*/ }names; struct male /*for taking the above person’s 3 male ancestors details if he is male*/ { unsigned char […]

用于从H / W寄存器读取的位字段

我想从32位寄存器读取第2,第5和第6位。 我决定使用struct位字段来存储它们。 以下数据结构是否正确? struct readData { int unwanted:1; int reqbit1:1; int unwanted1:2; int reqbit2:2; int unwanted2:26; }; 我不确定如何创建位字段。 我将使用一个API,它将字节从h / w寄存器直接复制到此结构。 在那种情况下,reqbit1会包含第二位吗? 根据我的理解,编译器将第一位分配给一个int变量,第二位分配给另一个int变量,因此reqbit1将不会从寄存器中读取任何数据。 以下联盟不适合这种情况吗? union readData { struct readBits{ bool unwanted:1; bool reqbit1:1; xxx unwanted1:2; short reqbit2:2; xxx unwanted2:26; }; int regValue; }; 如果这是对的,我应该将不想要的2声明为什么?

为什么包装不适用于兄弟工会或结构

在下面的例子中,我希望complex_t的大小与uint16_t相同:2个字节,但它是3个字节。 删除第二个联合(“proximity_unsafe”)会将大小减小到2个字节,但我无法弄清楚打包规则的模型。 #include #include typedef union { uint16_t unsafe; struct { uint16_t backwardmotion_unsafe : 1; uint16_t batteryvoltage_unsafe : 1; union { uint16_t dropoff_unsafe : 4; struct { uint16_t dropofffrontleft_unsafe : 1; uint16_t dropofffrontright_unsafe : 1; uint16_t dropoffsideleft_unsafe : 1; uint16_t dropoffsideright_unsafe : 1; }__attribute__((__packed__)); }__attribute__((__packed__)); union { uint16_t proximity_unsafe : 3; struct { uint16_t proximityfront_unsafe […]

在声明时初始化一个联合数组

我正在尝试在声明时初始化以下union数组: typedef union { __m128d m; float f[4]; } mat; mat m[2] = { {{30467.14153,5910.1427,15846.23837,7271.22705}, {30467.14153,5910.1427,15846.23837,7271.22705}}}; 但是我发现了以下错误: matrix.c: In function ‘main’: matrix.c:21: error: incompatible types in initialization matrix.c:21: warning: excess elements in union initializer matrix.c:21: warning: (near initialization for ‘m[0]’) matrix.c:21: warning: excess elements in union initializer matrix.c:21: warning: (near initialization for ‘m[0]’) matrix.c:21: warning: […]

C ++和C中的联合初始化

我已经在定义为的头文件中构建了一个使用常量的工作C库 typedef struct Y { union { struct bit_field bits; uint8_t raw[4]; } X; } CardInfo; static const CardInfo Y_CONSTANT = { .raw = {0, 0, 0, 0 } }; 我知道.raw初始化程序只是C语法。 如何在其中使用联合定义常量,以便我可以在C和C ++中使用它们。

在C中使用位域的正确方法是什么?

我正在使用位域来轻松访问浮动库我试图为没有FPU的微控制器。 问题是我似乎无法使用bitfields。 看一看: typedef struct { union{ unsigned long mantissa: 23; unsigned long exponent: 8; unsigned long sign: 1; float all; }; }_float __attribute__((__packed__)); 问题是,当我尝试访问或更改任何内容时,它会将位域分别视为末端的1,8,23位。 虽然它应该是从末尾开始的23位,然后是8位然后是最后一位。 除非我完全误解了位域的使用。 我认为使用打包可以解决问题,但你可以看到它没有。 任何帮助将非常感激。 我一直在谷歌搜索这个网站不止一次,所以我寄予厚望。

在C中键入命名空间

我已经在SO中读到了C中定义类型的不同命名空间,例如,Structs和Unions有一个命名空间,typedef有一个命名空间。 命名空间是这个的确切名称吗? C中存在多少个命名空间?

使用带有联合的位字段是否有效?

我使用了像这样的结构的bit字段, struct { unsigned int is_static: 1; unsigned int is_extern: 1; unsigned int is_auto: 1; } flags; 现在我想知道是否可以用一个联盟来完成,所以我修改了代码,如, union { unsigned int is_static: 1; unsigned int is_extern: 1; unsigned int is_auto: 1; } flags; 我找到了带有union的位字段,但是从输出中可以理解,并集中的所有字段都被赋予了一个位。 现在我看到使用带有union的位字段并不是错误的,但在我看来,像这样使用它在操作上是不正确的。 那么答案是什么 – 将字段与联合使用是否有效?