找回密码
 立即注册
查看: 12|回复: 1

Ai8051U-32Bit 计算二维数组的行数

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-10-13 18:16:44
已绑定手机

13

主题

42

回帖

179

积分

注册会员

积分
179
发表于 昨天 18:16 | 显示全部楼层 |阅读模式

unsigned char code tetris_code[][16] = {
{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*/
};


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



void LCD_display_ascii_characters(unsigned char arry[][16], 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[0]) = %d\r\n", sizeof(arry[0]));
        printf("(sizeof(arry) / sizeof(arry[0])) = %d\r\n", (sizeof(arry) / sizeof(arry[0])));
        printf("(sizeof(arry[0]) / sizeof(arry[0][0])) = %d\r\n", (sizeof(arry[0]) / sizeof(arry[0][0])));
        printf("(sizeof(arry) / sizeof(arry[0])) / (sizeof(arry[0]) / sizeof(arry[0][0])) = %d\r\n", (sizeof(arry) / sizeof(arry[0])) / (sizeof(arry[0]) / sizeof(arry[0][0])));

}

结果:

sizeof(tetris_code)  = 0

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


想计算tetris_code这个二维数组的行数,为什么标红的值跟设想的不一样?
回复

使用道具 举报 送花

3

主题

1888

回帖

624

积分

等待验证会员

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

一、二维数组的基本结构

定义如下二维数组:
  1. c
  2. unsigned char code tetriscode[][16] = {
  3.     {0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00}, // "T"
  4.     {0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x24,0x24,0x24,0x24,0x17,0x00}, // "e"
  5.     {0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x10,0x00}, // "t"
  6.     {0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00}, // "r"
  7.     {0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00}, // "i"
  8.     {0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00}  // "s"
  9. };
复制代码

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

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

1. sizeof(tetriscode) 的含义

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

2. 计算行数的公式

要计算二维数组的行数,可以使用如下公式:
  1. c
  2. int rows = sizeof(tetriscode) / sizeof(tetriscode[0]);
复制代码

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

因此:
  1. rows = 96 / 16 = 6
复制代码

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

三、代码验证

用户提供的打印语句如下:
  1. c
  2. printf("sizeof(tetriscode)  = %d\r\n", sizeof(tetriscode));
复制代码

如果运行该语句,输出应为:
  1. sizeof(tetriscode)  = 96
复制代码

如果用户希望输出数组的行数,可以扩展为:
  1. c
  2. printf("Number of rows: %d\r\n", sizeof(tetriscode) / sizeof(tetriscode[0]));
复制代码

输出应为:
  1. Number of rows: 6
复制代码

四、注意事项

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

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

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

五、函数参数传递与处理

用户提供的函数原型如下:
  1. c
  2. void LCDdisplayasciicharacters(unsigned char arry[][16], unsigned char x, unsigned char y)
  3. {
  4.     unsigned char i = 0, j;
  5.     // ...
  6. }
复制代码

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

解决办法:需要在调用函数时显式传入数组的行数:
  1. c
  2. void LCDdisplayasciicharacters(unsigned char arry[][16], unsigned char rows, unsigned char x, unsigned char y)
  3. {
  4.     for (unsigned char i = 0; i < rows; i++) {
  5.         // 显示第 i 行字符
  6.     }
  7. }
复制代码

调用方式如下:
  1. c
  2. LCDdisplayasciicharacters(tetriscode, sizeof(tetriscode) / sizeof(tetriscode[0]), x, y);
复制代码

六、总结

通过 sizeof 运算符可以有效地计算静态二维数组的行数,其核心公式为:
  1. c
  2. 行数 = sizeof(数组名) / sizeof(数组名[0])
复制代码

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

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

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

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

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-14 08:12 , Processed in 0.226314 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表