C语言变量声明问题(变量的作用域问题)

问题

使用STM32F103C8T6驱动ST7735S的TFT屏幕在声明变量时不规范导致不能正常显示图片

void LCD_Write_Data(uint8_t data)
{
	LCD_CS_Clr();
	for(unsigned char i=0;i<8;i++)
	{	
		LCD_SCLK_Clr();
		if(data&(0x80>>i))
		{
			LCD_MOSI_Set();
		}
		else 
		{
			LCD_MOSI_Clr();
		}
		LCD_SCLK_Set();
	}
	LCD_CS_Set();	
}
void LCD_Write_8bits(uint8_t dat)
{
	LCD_Write_Data(dat);
}

void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{
	u16 i,j;
	u32 k=0;
	LCD_Address_Set(x,y,x+length-1,y+width-1);
	for(i=0;i<length;i++)
	{	
		for(j=0;j<width;j++)
		{
			LCD_Write_8bits(pic[k*2]);
			LCD_Write_8bits(pic[k*2+1]);
			k++;
		}
	}			
}


int main(void)
{	

	delay_init();
	LED_Init();//LED初始化
	LCD_Init();//LCD初始化
	LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
	while (1)
	{

		LCD_ShowPicture(65,80,40,40,gImage_1);
	}
}

问题所在

 

 分析问题

在C语言中,变量的作用域是指变量在程序中可见的部分。如果在代码的其他地方有一个同名的变量,而且它的作用域包括 LCD_Write_Data 函数,那么它可能会影响到 LCD_Write_Data 函数内部的循环变量 i。这可能导致一些问题,如值被意外地修改或其他不确定的行为。

以下是可能导致同名变量干扰的一些原因:

    1.全局变量:

  • 如果在代码的其他地方有一个全局变量或者在 LCD_Write_Data 函数外定义的变量,而且它的名字也是 i,那么它将与函数内部的循环变量 i 具有相同的名字。在这种情况下,全局变量的值可能会被错误地修改。
  • uint8_t i; // 全局变量
    // 其他代码
    void LCD_Write_Data(uint8_t data) {
        // 此处的循环变量 i 可能与全局变量 i 发生冲突
    }
    

    2.其他函数内的变量:

  • 如果在其他函数中有一个名为 i 的变量,而且这个函数调用了 LCD_Write_Data,那么这个变量可能会与 LCD_Write_Data 中的循环变量 i 冲突。
  • void otherFunction() {
        uint8_t i; // 在其他函数内的变量
        // 调用LCD_Write_Data()
    }
    
    void LCD_Write_Data(uint8_t data) {
        // 此处的循环变量 i 可能与 otherFunction 函数内的变量 i 发生冲突
    }
    

    为了避免这些问题,可以使用以下方法:

  • 在函数内显式声明循环变量,确保它的作用域局限于函数内部。
  • 避免在全局范围内定义与函数内部变量相同的名字。
  • 注意其他调用该函数的地方,确保不会有同名的变量干扰。

 问题解决

将LCD_Write_Data()的for内部声明的变量i改为for外部声明后,函数 void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])可以正常使用

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值