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

C语言Cache Simulator缓存模拟器作业运行报error1错误排查

你代码的错误分为两类,一类是导致直接报错的语法/逻辑错误,一类是功能实现问题:

一、触发error1的直接原因

你代码main函数第一行判断if (argc !=7)就输出error1退出,这个程序要求运行时必须传入6个参数(加上程序自身一共7个命令行参数),参数顺序如下:

./可执行文件名 <缓存大小> <块大小> <替换策略> <映射方式> <预取块数> <输入trace文件路径>

比如正确运行示例:

./cache_sim 64 8 lru direct 2 ./trace.txt

你现在运行时没传够6个参数,还没走到打开文件的逻辑就已经触发error1退出了,所以你误以为是打开文件导致的error1,实际是参数数量不够。

二、其他必须修复的错误

  1. powerOfTwo函数调用括号写错
    你写的是:
if(powerOfTwo(cacheSize)==0 || powerOfTwo(blockSize==0)){

括号位置完全错了,应该是:

if(powerOfTwo(cacheSize)==0 || powerOfTwo(blockSize)==0){

你原来的写法是把blockSize==0这个布尔值(0或1)传给powerOfTwo,只要blockSize不为0,就会传入0,直接触发error3报错。

  1. allocateCache的malloc类型错误
    你原来的一级指针分配写的是:
struct cacheBlock** temp = malloc(sizeof(struct cacheBlock) * sets);

temp是存储struct cacheBlock*的指针数组,应该用指针的大小分配:

struct cacheBlock** temp = malloc(sizeof(struct cacheBlock*) * sets);

否则64位系统下会发生内存越界,直接崩溃。

  1. fscanf读取trace格式错误
    你原来的读取格式是:
fscanf(fp, "%c %lx\n", &readOrWrite, &address)

%c会读取换行、空格等空白字符,导致匹配失败,应该改成:

fscanf(fp, " %c %lx", &readOrWrite, &address)

格式符前加空格可以自动跳过所有空白字符,避免读到无效的换行符。

  1. 无符号类型赋值负数问题
    你多处写了cache[index][j].tag=(-1);,tag是unsigned long int无符号类型,赋值负数会发生隐式转换,最好改成直接标记valid为0即可,不需要赋值tag,或者用ULONG_MAX(需要引入<limits.h>头文件)。

三、其他注意事项

  • 编译的时候要加-lm参数链接数学库,因为你用了log函数,编译示例:gcc cache_sim.c -o cache_sim -lm
  • 你现在注释掉了替换策略(FIFO/LRU)的判断逻辑,目前实现的替换逻辑是LRU,第三个参数随便传lru或者fifo都不影响运行,但是必须传,否则参数数量不够会触发error1。
  • 你目前的预取逻辑有小问题:只要预取的块命中就直接停止后续预取,这个可以根据作业要求调整。

内容的提问来源于stack exchange,提问作者Abdul Haq Asif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:54:05