You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++开发Chip8模拟器调用fopen无法打开同目录rom文件求助

问题核心原因

你运行make run执行程序时,程序的当前工作目录是Makefile所在的项目根目录,而非bin目录。你传入的相对路径"picture.ch8"会让程序去项目根目录下查找文件,自然找不到你放在bin目录下的rom文件。


解决方案

1. 修复路径读取问题

二选一即可:

  • 直接把picture.ch8放到项目根目录(和Makefile同层级)
  • 修改Makefile的run目标,先切换到bin目录再执行程序,修改后代码如下:
run :
    cd $(OUTDIR) && ./$(OUT)

2. 附加排查建议

如果修改后还是报错,可以在OpenFile的错误分支加perror("fopen error"),可以打印出系统级的错误原因,方便定位是权限问题、文件名拼写错误还是其他问题。


你代码中存在的其他隐患

如果不修复,后续运行还是会出现崩溃、读取异常等问题:

  1. GetRomSize函数逻辑错误
    原代码写的是int size = end - size;,这里size是未初始化的随机值,正确写法应该是int size = end - start;,才能得到正确的rom文件大小。
  2. 类成员未初始化
    你没有写RomReader的构造函数,m_Reader和m_Rom初始都是野指针,GetRom中if(m_Rom == NULL)的判断会失效,建议添加构造函数初始化成员:
RomReader::RomReader() : m_Reader(NULL), m_Rom(NULL) {}
  1. 内存分配释放不匹配
    你用new uint8_t[size]分配数组,却用free()释放,属于未定义行为,应该把free(m_Rom)改成delete[] m_Rom。
  2. 重复释放内存
    main函数中你已经用free(rom)释放了内存,后续又调用romReader.FreeRom(),等于对同一块内存释放两次,会直接导致程序崩溃,删掉main里的free(rom)即可。

内容的提问来源于stack exchange,提问作者karthikkk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 05:42:03