繁体   English   中英

将 uint8_t 数组参数传递给 uint32_t 之外的子例程(从 uint8_t 数组转换为 uint32_t 数组)

[英]Passing uint8_t array argument to the subroutine that excepts uint32_t (conversion from uint8_t array to uint32_t array)

我有一个 C 子程序,如下所示,

   int sub_data (uint32_t size, uint32_t arrayB[])
   {
     int i;
     for(i=0; i<size; i++)
       printf("arrayB[%0d] = %2x\n", i , arrayB[i]);
   }

我想将下面的 arrayA 传递给上面提到的子程序,

   uint8_t arrayA = {0x12, 0x34, 0x56, 0x78, 0x9a};

   int main()
   {
     sub_data(5, arrayA);
     return 0;
   }

问题是 arrayA 的类型是 uint8_t 和 sub_data 除了参数为 uint32_t 我的要求是 sub_data 应该从 arrayA 中获取单个单词并存储在 arrayB 中作为单个单词

所以最终打印应该是,

arrayB[0] = 12
arrayB[1] = 34
arrayB[2] = 56
arrayB[3] = 78
arrayB[4] = 9a.

我正在努力进行转换。 我遇到的所有解决方案是将 arrayA 的四个字存储到 arrayB 的单个字中。 但我想要 arrayA 的单个单词作为 arrayB 的单个单词。

我如何做到这一点?

您可以使用memcpy用每个uint8_t数组元素填充uint32_t数组,并将其传递给函数:

uint8_t arrayA[5] = {0x12, 0x34, 0x56, 0x78, 0x9a};

uint32_t arrayB[5] = {0, 0, 0, 0, 0};

for (int i=0; i<5; i++)
    memcpy(&arrayB[i], &arrayA[i], sizeof(arrayA[i]));

sub_data(5, arrayB);

您可以使用通用宏并有多个函数来处理参数。

例子:

int sub_data_32 (uint32_t size, uint32_t *arrayB)
{
    int i;
    for(i=0; i<size; i++)
        printf("arrayB[%0d] = %2x\n", i , arrayB[i]);
}

int sub_data_16 (uint32_t size, uint16_t *arrayB)
{
    int i;
    for(i=0; i<size; i++)
        printf("arrayB[%0d] = %2x\n", i , arrayB[i]);
}

int sub_data_8 (uint32_t size, uint8_t *arrayB)
{
    int i;
    for(i=0; i<size; i++)
        printf("arrayB[%0d] = %2x\n", i , arrayB[i]);
}

#define sub_data(a,b) _Generic((b), \
              uint8_t *:  sub_data_8, \
              uint16_t *: sub_data_16, \
              uint32_t *: sub_data_32) (a,b)

uint8_t arrayA[] = {0x12, 0x34, 0x56, 0x78, 0x9a};
uint16_t arrayB[] = {0x13, 0x35, 0x57, 0x79, 0x9b};
uint32_t arrayC[] = {0x14, 0x36, 0x58, 0x7A, 0x9c};

int main()
{
    sub_data(5, arrayA);
    printf("-----------\n");
    sub_data(5, arrayB);
    printf("-----------\n");
    sub_data(5, arrayC);
    return 0;
}

https://onlinegdb.com/BJTqCPyJL

int sub_data (uint32_t size, uint32_t arrayB[])
   {
     int i;
     for(i=0; i<size; i++)
       printf("arrayB[%0d] = %2x\n", i , arrayB[i]);
   }

   uint8_t arrayA = {0x12, 0x34, 0x56, 0x78, 0x9a};

   int main()
   {
     uint32_t temp[5] = {0};

     int i;  
     for(i=0; i<5; i++)
       temp[i]=arrayA[i];

     sub_data(5, temp);
     return 0;
   }

在这里,我像这样从 uint8_t arrayA 中将数据一一分配给 uint32_t temp,

uint32_t temp[5] = {0};

     int i;  
     for(i=0; i<5; i++)
       temp[i]=arrayA[i];

这工作得很好。 谢谢@rici 的评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM