OpenEdv-开源电子网

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

做文件浏览,遇到个指针数组问题请教

[复制链接]

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-4-9
在线时间
3 小时
发表于 2013-9-2 23:27:48 | 显示全部楼层 |阅读模式

用原子哥的一段代码改,目的就是想把读取到的文件名缓存到 *fnbuf[10]中,方便后续选择文件操作,然后做了个测试代码

橙色代码部分都正常,就是到红色那一行,文件名就显示不对,不知哪里问题,是否是指针数组操作有问题?因为刚学C,很多的地方不懂

void File_Browse(u8 *path)
{ u8 i;
 u8 res;
 u16 rval=0;
  DIR tdir;    //临时目录
 FILINFO tfileinfo; //临时文件信息  
 u8 *fn;
 u8 *fnbuf[10];
 u8 file_cur=0; 
 
 OINT_COLOR=BLACK;
 LCD_ShowString(10,5,path_curr);//显示当前目录
        res=f_opendir(&tdir,(const TCHAR*)path); //打开目录
   tfileinfo.lfsize=_MAX_LFN*2+1;      //长文件名最大长度
 tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize); //为长文件缓存区分配内存 
 OINT_COLOR=BLUE; 
 if(res==FR_OK&&tfileinfo.lfname!=NULL) 
 {i=0;

  while(1)//查询总的有效文件数
  {
         res=f_readdir(&tdir,&tfileinfo);         //读取目录下的一个文件
         if(res!=FR_OK||tfileinfo.fname[0]==0)break; //错误了/到末尾了,退出   
       fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname); //取得文件名    
       fnbuf=fn;//缓存文件名
                 //Show_Str(30,20+i*20,fn,16,0x00); ///这一句OK
                 Show_Str(30,20+10*20,fnbuf,16,0x00);  //这一句OK 
                 i++;            
  } //^^^^^^^^^到这里,文件名列表显示都正常
 
  LCD_FILL(WHITE);//清屏
  OINT_COLOR=RED;
  Show_Str(30,20+10*20,fnbuf[1],16,0x00);//!!!<----这里文件名就显示不正常了,空白,或者乱码


  while(1)///仅仅测试文件名能不能被正确保存下来,加个死循环,方便查看效果
  {}
 }
 myfree(SRAMIN,tfileinfo.lfname);

}

 

 

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-3 10:19:41 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2013-4-9
在线时间
3 小时
 楼主| 发表于 2013-9-4 10:26:50 | 显示全部楼层

多谢原子哥指点,文件名没有先独立存储到内存中,所以之前所存储的指针都是无效的,修改如下
 
void File_Browse(u8 *path)
{ u8 i,j;
 u8 res;
 u16 rval=0;
  DIR tdir;    //临时目录
 FILINFO tfileinfo; //临时文件信息  
 u8 *fn;
 u8 *fn2[10];//存放10个文件名字符首地址
 u8 *fn_buf[10][200];//分配10个文件名缓存区 每个文件名最大长度设为200
 u8 file_cur=0; 
 
 OINT_COLOR=BLACK;
 LCD_ShowString(10,5,path_curr);//显示当前目录
        res=f_opendir(&tdir,(const TCHAR*)path); //打开目录
   tfileinfo.lfsize=_MAX_LFN*2+1;      //长文件名最大长度
 tfileinfo.lfname=mymalloc(SRAMIN,tfileinfo.lfsize); //为长文件缓存区分配内存 
 OINT_COLOR=BLUE; 
 if(res==FR_OK&&tfileinfo.lfname!=NULL) 
 {i=0;
  while(1)//查询总的有效文件数
  {
         res=f_readdir(&tdir,&tfileinfo);         //读取目录下的一个文件
         if(res!=FR_OK||tfileinfo.fname[0]==0)break; //错误了/到末尾了,退出   
       fn=(u8*)(*tfileinfo.lfname?tfileinfo.lfname:tfileinfo.fname);
     
      Show_Str(30,20+i*20,fn,16,0x00); 
    while(fn[j])//存储文件名到fn_buf
      {  fn_buf[j]=fn[j];
       fn2=&fn_buf[0];//保存文件名字符串首地址
        j++;
        }   
     i++;            
  }  
  LCD_FILL(WHITE);//清屏
  OINT_COLOR=RED;
                   j=0;
                  while(i)//重新显示一次文件名列表
                    {
                     Show_Str(30,20+j*20,fn2[j],16,0x00);
                      j++;
                      i--;
                    }

  while(1)//方便测试,死循环
  {}
 }
 myfree(SRAMIN,tfileinfo.lfname);
 //return rval;
}

 

回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
发表于 2014-6-7 18:12:17 | 显示全部楼层
mark...............
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 11:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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