Riderppp 《软件工程(C编码实践篇)》MOOC课程作业
http://mooc.study.163.com/course/USTC-1000002006
实验结果
实验过程
这次实验首先是要求从源文件中找到bug,一开始的时候输入quit命令会显示指令错误,如下图
找了好久可算找着了,原因在linktable.c
这个文件中(这里贴出修改后的代码)
/*
* linktable.c
* 原代码中while循环的条件是(pNode != pLinkTable -> pTail)
* 也就是说不会遍历链表中的最后一个节点 也就是quit 这就是quit没能被找到的原因
*/
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode), void * cmd)
{
if(pLinkTable == NULL || Conditon == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)// <<====出错位置
{
if(Conditon(pNode, cmd) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
为了验证一下,将main.c
中的IniMenuData
函数中quit命令和version命令换一下顺序,结果如下
看来bug分析正确,要改正bug只需要将while循环的条件修改一下就行了
实验还有个要求是用callback增强链表模块,下面贴出改动函数的代码
/*
* menu.c
* 在SearchCondition函数的参数中加入了cmd,增强查找条件模块
*
*/
int SearchCondition(tLinkTableNode * pLinkTableNode, void * cmd)
{
tDataNode * pNode = (tDataNode *)pLinkTableNode;
if(strcmp(pNode->cmd, cmd) == 0)
{
return SUCCESS;
}
return FAILURE;
}
tDataNode* FindCmd(tLinkTable * head, char * cmd)
{
if(head == NULL)
{
printf("Don't exist this table!");
return NULL;
}
return (tDataNode*)SearchLinkTableNode(head,SearchCondition,(void *)cmd);
}
/*
* linktable.c
* 修改了一下函数的参数列表,前后对应
*
*/
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode), void * cmd)
{
if(pLinkTable == NULL || Conditon == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)
{
if(Conditon(pNode, cmdz) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
最后再把修改完的代码git一下
实验总结
最深刻的还是体验了一回找bug,找了好久深知找bug不易。用callback增强函数模块,提升函数的健壮性