网易云课堂昵称:sa17225159
《软件工程(C编码实践篇)》MOOC课程作业 http://mooc.study.163.com/course/USTC-1000002006
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8
实验要求
新创建一个目录lab5完成实验。
然后将lab5-1.tar.gz中的代码(即解压后lab5.1/目录下的源文件)直接放到lab5/目录下继续完成后面的实验内容
实验要求(参照视频中的具体实验过程) 本实验在提供的代码基础上进行
- 给lab5-1.tar.gz找bug,quit命令无法运行的bug
- 利用callback函数参数使Linktable的查询接口更加通用
- 注意接口的信息隐藏
一定要及时提交代码以防丢失
实验过程
1. 找bug
因为实验代码lab5-1.tar.gz在实验楼的环境中,所以我先在实验楼中将代码解压,如下图
然后将代码上传至github,地址是https://github.com/libaoquan95/seClass_lab5.1.git,过程如下
然后再将代码下载至本机虚拟机中运行,这么做只是因为我不习惯实验楼的环境。
运行发现执行quit命令不能正确退出,且程序报错:
Input a cmd number > quit
This is a wrong cmd!
检查源代码,发现在menu.c的main()函数中,当p==NULL时会报此类型错误。
tDataNode *p = FindCmd(head, cmd);
if( p == NULL)
{
printf("This is a wrong cmd!\n ");
continue;
}
猜测是FindCmd()函数出现问题。
/* find a cmd in the linklist and return the datanode pointer */
tDataNode* FindCmd(tLinkTable * head, char * cmd)
{
return (tDataNode*)SearchLinkTableNode(head,SearchCondition);
}
而FindCmd()函数仅仅是调用了linktable.c中的SearchLinkTableNode()函数,所以继续在SearchLinkTableNode()中排查错误。
/*
* Search a LinkTableNode from LinkTable
* int Conditon(tLinkTableNode * pNode);
*/
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
{
if(pLinkTable == NULL || Conditon == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != pLinkTable->pTail)
{
if(Conditon(pNode) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
问题出现在while循环中,循环会在访问到链表最后一个节点之前退出循环,而quit命令位于链表尾部,所以执行quit命令会出现问题,将代码修改如下:
/*
* Search a LinkTableNode from LinkTable
* int Conditon(tLinkTableNode * pNode);
*/
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
{
if(pLinkTable == NULL || Conditon == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)
{
if(Conditon(pNode) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
重新编译并运行
bug已被排除。
2. 优化代码结构
1.建立远程仓库,并下载到本地,远程仓库地址:https://github.com/libaoquan95/seClass_lab5.git
git clone https://github.com/libaoquan95/seClass_lab5.git
并进入版本库并复制 menu.c linktable.h linktable.c 文件