c - 如何将混合类型数组转换为 char 数组并返回?

标签 c pointers unions

我必须通过 SPI 将混合类型数组( union )从一个 uController(源)传输到另一个 uController(目标),因此我必须在传输之前将整个传输 block 放入 uint8_t 数组,然后在将 uC 目标返回到混合类型 union 数组。

我尝试了以下方法,但它不起作用。 (简体)

int i;
int len=4;

union dummy{
    float f32;
    uint32_t u32;
    uint8_t u8[4];
};

union dummy inst1[len]; //First instance on source uC
union dummy inst2[len]; //Second instance on target uC


inst1[0].u8[0]=73;
inst1[1].f32=17.5;
//... and so on

printf("Source: %d, %f\n",inst1[0].u8[0],inst1[1].f32);

//Prepare SPI uint8_t array
uint8_t spi_arr[4*len];

*spi_arr=*inst1; //Wrong. What to do here?

//SPI uint8_t array arrived on target. Convert it back to union type

*inst2=*spi_arr; //Wrong. What to do here?

printf("Target: %d, %f\n",inst2[0].u8[0],inst2[1].f32);

它给我错误:

error: incompatible types when assigning to type 'uint8_t {aka unsigned char}' from type 'union dummy'

我想要的只是按原样来回复制数组的内容。如何做到这一点?

最佳答案

这是一个示例程序,展示了如何使用指针访问两种不同类型的数据:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int len = 4;

union dummy{
    float f32;
    uint32_t u32;
    uint8_t u8[4];
};

int main(void) {
    union dummy inst1[len]; //First instance on source uC
    union dummy *inst2; //Second instance on target uC
    uint8_t *spi_arr;

    for (int index = 0; index < len; index++) {
        for (int inner_index = 0; inner_index < 4; inner_index++) {
            inst1[index].u8[inner_index] = '1' + inner_index;
        }
    }

    spi_arr = (uint8_t *) inst1;

    for (int index = 0; index < sizeof(inst1); index++) {
        printf("%c", spi_arr[index]);
    }
    printf("\n\n");

    inst2 = (union dummy *) spi_arr;

    for (int index = 0; index < len; index++) {
        for (int inner_index = 0; inner_index < 4; inner_index++) {
            printf("%c", inst2[0].u8[inner_index]);
        }
        printf("\n");
    }

    return 0;
}

输出

1234123412341234

1234
1234
1234
1234

关于c - 如何将混合类型数组转换为 char 数组并返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56202052/

相关文章:

c - 逐行读取 C 文件,其中每行的长度未知

c++ - 找不到为什么 g++ 认为函数未在范围内声明

mysql - 创建 gtk ListView 时出错

c++ - 如果输入大于零,是否有一个单行代码可以从输入中减去 1?

c++ - 在仿真器中使用 union 来模拟 CPU 寄存器有多合适?

c - union 成员如何存储?

c - 使用宏初始化通过引用传递的结构

c - 来自 c 中双指针的 Memcpy

c - Int 指针在 C 中具有奇怪的行为

c - 标记 union 中的函数指针为 "tag"