打印

纠结的结构体

[复制链接]
2037|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ngyg12|  楼主 | 2010-9-29 13:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在写一个函数的时候遇到个这样的问题:
FRESULT CreateONEFile(const char *filename)
{
   FATFS fs_cre;    // Work area (file system object) for logical drive
   FIL  fsrc;      // file objects
    FRESULT res;    // FatFs function common result code
  
  //
  // Register a work area for logical drive 0
  //
  f_mount(0, &fs_cre);
  
  // Create  file
  res = f_open(&fsrc, filename, FA_CREATE_ALWAYS | FA_WRITE);
  
  f_close(&fsrc);
  
  return (res);
}

这是一个用 FATFS 系统写的一个生成一个文件的函数,写好了,语法没有错误,通过编译下载到 ARM 上,没想到,程序卡死了.但是如果把FATFS fs_cre 定义成 static FATFS fs_cre 或者 定义成全局变量就会很顺利,也能实现预想的功能!
我在调试的时候,它们的区别就是初始化和未被初始化.但是我又不想把把定义成静态或者全局的,剩下的就只有初始化为0,但是 FATFS 是文件系统自己定义的一个结构体,具体的成员我也不知道,所以初始化也不行.这便令我很纠结啊! 不知道有哪位大虾能帮小弟解决一下...

相关帖子

沙发
senioryzc| | 2010-9-30 09:51 | 只看该作者
第一,如果你能编译,就不可能看不到FATFS的定义
第二,即使你看不到,memset(&fs_cre, 0, sizeof(fs_cre ));也可以全部初始化为0
第三,看描述,和初不初始化没关系,可能是结构体FATFS太大,定义为局部变量,导致栈溢出而死机

使用特权

评论回复
板凳
arm9-11| | 2010-9-30 14:08 | 只看该作者
兰州,不出我所料,你应该在其他地方调用了比如f_open f_write等之类的函数。你的FATFS fs_cre是在挂载U盘的时候使用的,如果你不把他定义为static 或者全局变量,那么退出这个函数后,这个结构体就没有了,挂载的文件系统用什么来描述呢?

你这样写程序是很容易出问题的,不应该在你想要创建一个文件的时候再来挂载,应该是检测到U盘插上了就马上挂载,检测到U盘拔掉了就卸载。要创建的时候就不用再去挂载了,明白?

使用特权

评论回复
地板
ngyg12|  楼主 | 2010-9-30 22:20 | 只看该作者
3# arm9-11

说真的,我还没想过呢!呵呵,谢谢哈...

使用特权

评论回复
5
ngyg12|  楼主 | 2010-9-30 22:23 | 只看该作者
2# senioryzc ze

怎么说呢, 因为它有很多的条件编译, 在定义结构体的时候就有条件编译,不同情况就有不同的定义情况, 结构体也就变了, 这样的话, 就算有初始化函数, 也不通用了啊!不过还是谢谢你啊!  呵呵...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:菜鸟一个望大家多多指教...

5

主题

553

帖子

5

粉丝