由于我发现在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
包含我想要的格式的数据。
答案 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
。