CacheLab 日志(2)

这个实验指导上面的文字还不能复制,搞得我还要截图,烦~
而且还分两页,我还得用 PhotoShop 拼接一下,烦得要命(→_→)
这个米田共一样的排版我也不想多说什么了。


德丽莎看了想摔键盘
实验任务

这怎么还要我自己写一个 get_Opt 函数呢? 所以 PPT 里面介绍的 getopt 函数是干啥用的?!

没办法,人家怎么要求就得怎么写呀。既然要自己写参数处理函数,那就得先了解一下 argv 数组的内部情况。为此先做个小实验:( argc 是计数变量,用于统计参数的个数)

for (int i = 0; i < argc; i++)
    {
        printf("%s\n", argv[i]);
    }

结论:argv 是一个字符串数组,将命令行整个一行的按空格划分为一个个字符串保存起来。比如:
./test -a 3 -b 4 -c 5
在 argv 数组中保存为:

argv[0] argv[1] argv[2] argv[3] argv[4] argv[5] argv[6]
"./test" "-a" "3" "-b" "4" "-c" "5"

接下来理清三个函数 printHelpMenu, checkOptarg, 和 get_Opt 的关系,并开始编写这三个函数:

帮助信息打印函数 printHelpMenu

这个直接把 csim-ref -h 的打印信息搬过来就行了,实现如下:

void printHelpMenu()
{
    printf("Usage: ./csim-ref [-hv] -s  -E  -b  -t \n");
    printf("Options:\n");
    printf("  -h         Print this help message.\n");
    printf("  -v         Optional verbose flag.\n");
    printf("  -s    Number of set index bits.\n");
    printf("  -E    Number of lines per set.\n");
    printf("  -b    Number of block offset bits.\n");
    printf("  -t   Trace file.\n");
    printf("\n");
    printf("Examples:\n");
    printf("  linux>  ./csim-ref -s 4 -E 1 -b 4 -t traces/yi.trace\n");
    printf("  linux>  ./csim-ref -v -s 8 -E 2 -b 4 -t traces/yi.trace\n");
}

查错函数 checkOptarg

根据实验要求,此函数用于检查命令行输入参数的合法性。
参数出错有两种情况:

  • 未定义的参数
  • 缺少必要参数

未定义的参数:

根据说明文档,csim 接受的参数只有 -h, -v, -s, -E, -b, -t 。此外全部是非法参数,当输入非法参数时,应当给出错误提示并打印使用帮助。以下是 csim-ref 输入非法参数 "-x 3 -y 4" 的结果:

./csim-ref: invalid option -- 'x'
Usage: ./csim-ref [-hv] -s  -E  -b  -t 
Options:
  -h         Print this help message.
  -v         Optional verbose flag.
  -s    Number of set index bits.
  -E    Number of lines per set.
  -b    Number of block offset bits.
  -t   Trace file.

Examples:
  linux>  ./csim-ref -s 4 -E 1 -b 4 -t traces/yi.trace
  linux>  ./csim-ref -v -s 8 -E 2 -b 4 -t traces/yi.trace

缺少必要参数

csim 接受的参数 -h, -v, -s, -E, -b, -t 中,-h, -v 是可选的,而其余参数都是缺一不可的。当缺少任意一个必要参数时,应当给出错误提示并打印使用帮助(要求其他参数合法,否则会报非法参数的错误,而不是缺少参数的错误)。以下是 csim-ref 输入参数 "-s 3 -E 4" 的结果:

./csim-ref: Missing required command line argument
Usage: ./csim-ref [-hv] -s  -E  -b  -t 
Options:
  -h         Print this help message.
  -v         Optional verbose flag.
  -s    Number of set index bits.
  -E    Number of lines per set.
  -b    Number of block offset bits.
  -t   Trace file.

Examples:
  linux>  ./csim-ref -s 4 -E 1 -b 4 -t traces/yi.trace
  linux>  ./csim-ref -v -s 8 -E 2 -b 4 -t traces/yi.trace

特殊情况

对 csim-ref 测试发现,当命令行中包含 -h 时,会直接打印帮助信息并忽略此后的所有参数,不会报缺少参数错误;当 -h 前面有非法参数的时候会报非法参数错误。

思路整理、问题、吐槽

  1. 检查出错误会打印错误信息与帮助信息,那么显然 checkOptarg 函数内部要调用 printHelpMenu 函数。
  2. 一般来说,检查出错误应该直接停止程序吧?但是 checkOptarg 函数居然要求是 void 类型的,无法提供反馈!

实现

你可能感兴趣的:(CacheLab 日志(2))