繁体   English   中英

尝试将二维数组转换为嵌入式C中的一维

[英]Attempting to convert a 2 dimensional array to single dimension in embedded C

由于发现用C操作2维数组非常困难,因此我决定尝试编写一个函数,该函数将2D数组转换为1D数组。 对于下面的2D数组,我希望将其转换为类似1D_array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }

我在堆栈交换中遇到了一个非常类似的问题,链接在下面,并使用了建议的代码。

将2D数组转换为单个数组

我使用的代码是:

#define KP_ROWS 4
#define KP_COLS 4

static Uint16 KP_TEST_Keys[KP_ROWS][KP_COLS] = {
    {  1,  2,  3,  4 },
    {  5,  6,  7,  8 },
    {  9, 10, 11, 12 },
    { 13, 14, 15, 16 }
};

void main()
{
    Uint16 array1D[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    memcpy(array1D, KP_TEST_Keys, sizeof(Uint16) * KP_ROWS * KP_COLS);
}

同样,我的总体目标是将2D数组转换为1D数组。

编辑:清除错误后,我才编辑并刚刚测试了上面的代码,它可以正常工作! array1D包含我想要的格式的数据。

我是否正确使用memcpy?

可以,但是容易出错,因为array1D的大小KP_TEST_KeysKP_TEST_Keys的大小KP_TEST_Keys

Uint16 array1D[KP_ROWS*KP_COLS] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ;

// Recommend size of destination, not size of source
// Ideally, it would be the minimum of the size of source and destination.
memcpy(array1D, KP_TEST_Keys, sizeof array1D);

正如@Kurokawa Masato所说,必须在函数中使用memcpy()


建议使用uint16_t类的标准类型,而不是Uint16

2D阵列数据已经按照您1D阵列所需的顺序连续存储。 完全不需要在单独的数组中复制数据; 您只需要按如下方式转换2D数组:

Uint16* array1D = (Uint16*)KP_TEST_Keys ;

这提供了2D阵列的1D阵列视图 ,而无需复制数据。 对1D视图的更改直接更改了2D数据,因此无需在两个表示之间进行复制。

如果一维数组视图为只读,则可以通过以下方式强制执行此操作:

const Uint16* array1D = (const Uint16*)KP_TEST_Keys ;

此外,如果将1D阵列锁定到2D阵列并且不能够重新分配给其他阵列,则:

Uint16* const array1D = (Uint16* const)KP_TEST_Keys ;

或两者结合使用(指向常量数据的常量指针):

const Uint16* const array1D = (const Uint16* const)KP_TEST_Keys ;

这里的一个重要区别是sizeof(array1D)是指针的大小,而不是数组的大小。 您应该同时使用sizeof(KP_TEST_Keys)

如果在KP_TEST_Keys声明之后在文件作用域进行了这些声明,则一维视图将以与2D相同的生存期作用域存在:

static Uint16 KP_TEST_Keys[KP_ROWS][KP_COLS] = {
    {  1,  2,  3,  4 },
    {  5,  6,  7,  8 },
    {  9, 10, 11, 12 },
    { 13, 14, 15, 16 }
};
static Uint16* array1D = (Uint16*)KP_TEST_Keys ;

您还可以在使用时直接执行强制转换,而不用引入新变量来访问各个元素,例如:

Uint16 element = ((Uint16*)KP_TEST_Keys)[i] ;

其中isizeof(KP_TEST_Keys) - 1引0。

暂无
暂无

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

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