尝试在嵌入式C中将二维数组转换为单维

时间:2016-03-12 21:48:31

标签: c arrays

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

之类的内容

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

Convert 2D array to single array

我正在使用的代码是:

#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包含我想要的格式的数据。

2 个答案:

答案 0 :(得分:3)

  

我正确使用memcpy吗?

好的,但很容易失败,因为array1D的大小并不一定与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

答案 1 :(得分:1)

2D阵列数据已按照您的1D阵列所需的顺序连续存储;根本不需要在单独的数组中复制数据;你只需按如下方式投射2D数组:

Uint16* array1D = (Uint16*)KP_TEST_Keys ;

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

如果1D数组视图是只读的,您可以通过以下方式强制执行:

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之后在文件范围内进行了这些声明,则1D视图将与生命周期范围一样存在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] ;

其中i是1D索引0到sizeof(KP_TEST_Keys) - 1