OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3414|回复: 2

路过的各位大神,请问为什么我这个程序用了sprintf就无法返回?

[复制链接]

1

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2020-10-3
在线时间
19 小时
发表于 2020-10-25 11:28:46 | 显示全部楼层 |阅读模式
1金钱
         路过的各位大神,我移植了http://www.openedv.com/forum.php ... hlight=%B2%CB%B5%A5这位大神的LCD菜单,但是我发神用在设置时间中用了sprintf 就无法返回主菜单了,调试发现系统运行到了错误中断里!


  1. void testdis()
  2. {
  3.     uint8_t encode;
  4.     uint8_t t;
  5.     char str[1] = {0};           
  6.      ClearDisplay();        
  7.     while(1)
  8.     {
  9.         encode = encoder_read();
  10.       if(encode)
  11.       {
  12.         if(encode == 4)
  13.         {
  14.           break;
  15.         }
  16.         if(encode==1)
  17.         {
  18.             t++;
  19.         }
  20.         if(encode==2)
  21.         {
  22.             t--;
  23.         }
  24.          
  25.       }
  26.         
  27.      
  28.       Disp_String_Menu(32,0,(uint8_t *)"时间设置",16,0,0);
  29.       sprintf(str,"test: %d",t);                                                     //<font color="#ff0000">如果注释这句,下面那句直接用一个字符串就能返回到主菜单,请问这里什么原因???</font>
  30.       LCD_P5x8Str(10,2,(uint8_t *)str);
  31.    
  32.     }

  33.         

  34. }

  35. //显示菜单项
  36. void ShowMenu(uint8_t line) //显示菜单项并设置选中的项反白
  37. {
  38. int i;
  39. line = 3-(currentMenu->range_to-line);
  40.     for(i = 0;i<4;i++)
  41.     {
  42.        if(i==line){
  43.            Disp_String_Menu(5,i,(uint8_t *)currentMenu->menuItems[i+currentMenu->range_from],16,1,0);
  44.        }else{
  45.             Disp_String_Menu(5,i,(uint8_t *)currentMenu->menuItems[i+currentMenu->range_from],16,0,0);        
  46.        }

  47.     }   
  48. }
  49. void func(void)
  50. {
  51.   printf("hello\r\n");
  52. }

  53. void initMenu()
  54. {
  55.      MainMenu.subMenus = malloc(sizeof(&MainMenu)*4);
  56.      MainMenu.subMenus[0] = NULL;//第1到3项没有子菜单置null,选择后程序会调用func中相应项中的函数
  57.      MainMenu.subMenus[1] = NULL;
  58.      MainMenu.subMenus[2] = NULL;
  59.      MainMenu.subMenus[3] = &searchMenu;//第四项查询有子菜单
  60.      MainMenu.func = malloc(sizeof(&func)*4);
  61.      MainMenu.func[0] = NULL;
  62.      MainMenu.func[1] = NULL;
  63.      MainMenu.func[2] = &testdis;//当选择了并按了确定,会执行func函数
  64.      MainMenu.func[3] = NULL;
  65.      MainMenu.parent = NULL;//表示是顶级菜单
  66.      
  67.      searchMenu.subMenus = malloc(sizeof(&searchMenu)*6);
  68.      searchMenu.subMenus[0] = searchMenu.subMenus[1] = searchMenu.subMenus[2] = searchMenu.subMenus[3] = searchMenu.subMenus[4] = searchMenu.subMenus[5] = NULL;
  69.      searchMenu.func = malloc(sizeof(&printf)*6);
  70.      searchMenu.func[0] = searchMenu.func[2] = searchMenu.func[2] = searchMenu.func[3] = searchMenu.func[4] = searchMenu.func[5] = NULL;
  71.      searchMenu.parent = &MainMenu;//上一级菜单是MainMenu.进入查询子菜单后按返回键,将会显示这个菜单 项
  72.      
  73.      currentMenu = &MainMenu;

  74. }


  75. /**************************************************************

  76. *  函数说明:Flash处理目录初始化函数                          *

  77. **************************************************************/





  78. void MenuTree(void)
  79. {
  80.    
  81.    encode = encoder_read();
  82.    
  83.    if (encode==4)
  84.    {
  85.       ClearDisplay();
  86.       ShowMenu(currentMenu->selected);
  87.       while(1)
  88.       {
  89.         encode = encoder_read();
  90.           switch(encode)
  91.           {
  92.                case 2://向右
  93.                     if(currentMenu->selected == 0)//到了第一项
  94.                         break;
  95.                     else
  96.                     {
  97.                          currentMenu->selected--;
  98.                          if(currentMenu->selected < currentMenu->range_from)//更新显示的区域
  99.                          {
  100.                           currentMenu->range_from = currentMenu->selected;
  101.                           currentMenu->range_to = currentMenu->range_from+3;
  102.                          }
  103.                          ClearDisplay();
  104.                          ShowMenu(currentMenu->selected);
  105.                          break;
  106.                     }
  107.                case 1://向左
  108.                         if(currentMenu->selected == currentMenu->itemCount-1)
  109.                             break;
  110.                         else
  111.                         {
  112.                          currentMenu->selected++;
  113.                          if(currentMenu->selected>currentMenu->range_to)
  114.                          {
  115.                           currentMenu->range_to = currentMenu->selected;
  116.                           currentMenu->range_from = currentMenu->range_to-3;
  117.                          }
  118.                          ShowMenu(currentMenu->selected);
  119.                             break;
  120.                          }
  121.                case 3://Enter键
  122.                            {
  123.                             if(currentMenu->subMenus[currentMenu->selected] !=NULL)
  124.                             {
  125.                                  currentMenu = currentMenu->subMenus[currentMenu->selected];
  126.                                  ClearDisplay();
  127.                                  ShowMenu(0);
  128.                             }
  129.                             else
  130.                             {
  131.                                  if(currentMenu->func[currentMenu->selected] != NULL)
  132.                                  {
  133.                                   currentMenu->func[currentMenu->selected]();//执行相应的函数
  134.                                   ClearDisplay();
  135.                                   ShowMenu(currentMenu->selected);//返回后恢复原来的菜单状态
  136.                                  }
  137.                             }
  138.                                 break;
  139.                            }
  140.                case 4://返回键
  141.                            {
  142.                                 if(currentMenu->parent!=NULL)//父菜单不为空,将显示父菜单
  143.                                 {
  144.                                  currentMenu = currentMenu->parent;
  145.                                  ClearDisplay();
  146.                                  ShowMenu(currentMenu->selected);
  147.                                 }
  148.                                 break;
  149.                            }
  150.                default:
  151.                     break;
  152.        }
  153.       
  154.       }
  155.    }
  156. }
复制代码
问题就是出在无法返回主菜单,直接显示一个字符串是可以返回的,但是如果用sprintf就无法返回了???在线等,求大神指点一下!

最佳答案

查看完整内容[请看2#楼]

sprintf(str,"test: %d",t); str的字节长度只有1,啥都存不了,缓存溢出了,str缓存要搞大! 这两天连续看到有人使用sprintf后导致缓存溢出。 再说一遍吧,不要用sprintf,这个API不安全,用snprintf安全点。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2020-10-25 11:28:47 | 显示全部楼层
sprintf(str,"test: %d",t);
str的字节长度只有1,啥都存不了,缓存溢出了,str缓存要搞大!

这两天连续看到有人使用sprintf后导致缓存溢出。
再说一遍吧,不要用sprintf,这个API不安全,用snprintf安全点。
回复

使用道具 举报

1

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2020-10-3
在线时间
19 小时
 楼主| 发表于 2020-10-26 12:19:35 来自手机 | 显示全部楼层
ufbycd 发表于 2020-10-26 11:00
sprintf(str,"test: %d",t);
str的字节长度只有1,啥都存不了,缓存溢出了,str缓存要搞大!


感谢回复,问题解决了,是我理解错误,我以为我申明一个变量,str数组长度也是1
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 22:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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