mfsljtpq 发表于 3 天前

Ai8051U-32Bit 计算二维数组的行数|已解决

unsigned char code tetris_code[] = {
{0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00},/*"T",0*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x24,0x24,0x24,0x24,0x17,0x00},/*"e",1*/
{0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00},/*"t",2*/
{0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00},/*"r",3*/
{0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},/*"i",4*/
{0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00},/*"s",5*/
};


unsigned char code my_arry[] = {
      {1,2,3,4,5},{6,7,8,9,10}
};

printf("sizeof(my_arry) / sizeof(my_arry)= %d\r\n", sizeof(my_arry) / sizeof(my_arry));
printf("sizeof(tetris_code)= %d\r\n", sizeof(tetris_code));



void LCD_display_ascii_characters(unsigned char arry[], unsigned char x, unsigned char y)
{
      unsigned char i = 0, j = 0, k = 0, tmp_page, tmp_colum;

      printf("sizeof(arry)= %d\r\n", sizeof(arry));
      printf("sizeof(arry) = %d\r\n", sizeof(arry));
      printf("(sizeof(arry) / sizeof(arry)) = %d\r\n", (sizeof(arry) / sizeof(arry)));
      printf("(sizeof(arry) / sizeof(arry)) = %d\r\n", (sizeof(arry) / sizeof(arry)));
      printf("(sizeof(arry) / sizeof(arry)) / (sizeof(arry) / sizeof(arry)) = %d\r\n", (sizeof(arry) / sizeof(arry)) / (sizeof(arry) / sizeof(arry)));

}

结果:


sizeof(my_arry) / sizeof(my_arry)= 2
sizeof(tetris_code)= 0

sizeof(arry)= 4
sizeof(arry) = 16
(sizeof(arry) / sizeof(arry)) = 0
(sizeof(arry) / sizeof(arry)) = 16
(sizeof(arry) / sizeof(arry)) / (sizeof(arry) / sizeof(arry)) = 0


想计算tetris_code这个二维数组的行数,为什么标红的值跟设想的不一样?跟 tetris_code类型一样但大小不一样的my_arry却可以被正确计算。

国芯人工智能 发表于 3 天前

在C语言中,计算一个二维数组的行数是一个常见的需求,尤其是在处理嵌入式系统中的字符点阵、图像数据等场景时。本文将从专业角度出发,详细分析如何通过 sizeof 运算符计算二维数组的行数,并结合用户提供的代码片段进行具体说明。

一、二维数组的基本结构

定义如下二维数组:

c
unsigned char code tetriscode[] = {
    {0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00}, // "T"
    {0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x24,0x24,0x24,0x24,0x17,0x00}, // "e"
    {0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00}, // "t"
    {0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00}, // "r"
    {0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, // "i"
    {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00}// "s"
};

这是一个二维数组,其类型为 unsigned char [],即每行有16个字节,总共有6行。数组名 tetriscode 表示整个数组的起始地址。

二、使用 sizeof 运算符计算行数

1. sizeof(tetriscode) 的含义

sizeof(tetriscode) 返回整个数组所占内存的大小(单位为字节)。在本例中,每行有16个字节,共有6行,因此:

sizeof(tetriscode) = 616 = 96 字节

2. 计算行数的公式

要计算二维数组的行数,可以使用如下公式:

c
int rows = sizeof(tetriscode) / sizeof(tetriscode);

其中:
sizeof(tetriscode):整个数组的大小;
sizeof(tetriscode):第一行的大小,即一行所占字节数。

因此:

rows = 96 / 16 = 6

该方法适用于静态数组,即数组大小在编译时已知的情况。

三、代码验证

用户提供的打印语句如下:

c
printf("sizeof(tetriscode)= %d\r\n", sizeof(tetriscode));

如果运行该语句,输出应为:

sizeof(tetriscode)= 96

如果用户希望输出数组的行数,可以扩展为:

c
printf("Number of rows: %d\r\n", sizeof(tetriscode) / sizeof(tetriscode));

输出应为:

Number of rows: 6

四、注意事项

1. 仅适用于静态数组:该方法只适用于在函数内部定义的静态数组,不能用于通过指针传递的数组。例如,如果函数参数是 unsigned char arry[],则 sizeof(arry) 将返回指针的大小(通常是4或8字节),而不是整个数组的大小。

2. 列数必须固定:二维数组的列数必须在编译时确定,否则无法使用上述方法。例如,unsigned char arry[][ ] 是不允许的,除非在初始化时明确指定列数。

3. 数据对齐与填充:在某些编译器或平台下,可能存在结构体或数组的填充(padding)问题,但在本例中由于是 unsigned char 类型,不会有额外填充。

五、函数参数传递与处理

用户提供的函数原型如下:

c
void LCDdisplayasciicharacters(unsigned char arry[], unsigned char x, unsigned char y)
{
    unsigned char i = 0, j;
    // ...
}

在此函数中,arry 是一个指向 unsigned char 的指针。由于函数参数中数组会退化为指针,因此在函数内部无法通过 sizeof(arry) 获取数组的总大小。

解决办法:需要在调用函数时显式传入数组的行数:

c
void LCDdisplayasciicharacters(unsigned char arry[], unsigned char rows, unsigned char x, unsigned char y)
{
    for (unsigned char i = 0; i < rows; i++) {
      // 显示第 i 行字符
    }
}

调用方式如下:

c
LCDdisplayasciicharacters(tetriscode, sizeof(tetriscode) / sizeof(tetriscode), x, y);

六、总结

通过 sizeof 运算符可以有效地计算静态二维数组的行数,其核心公式为:

c
行数 = sizeof(数组名) / sizeof(数组名)

但需注意:
该方法仅适用于静态数组;
数组列数必须固定;
函数参数中数组会退化为指针,需手动传递行数。

在嵌入式开发中,这种技巧常用于处理字符点阵、图形数据等,具有良好的实用性与可移植性。

如需进一步扩展该功能,例如支持不同列数的数组或动态分配数组,可结合模板(C++)或宏定义(C语言)实现更通用的解决方案。

[本文内容由国芯人工智能辅助生成,仅供参考]

mfsljtpq 发表于 前天 09:38

已解决
页: [1]
查看完整版本: Ai8051U-32Bit 计算二维数组的行数|已解决