DEBUG(2)--函数的输入参数要做适当的检查
今天在调试程序时发现,在单步运行的情况下,程序执行没有问题,但是直接运行就会出问题。出问题的代码如下
for(int col=0;col<=9;++col)
{
int killid=PositionId(row,col);
if(sameColor(id,killid))
{
continue;
}
if(CanMove(id,row,col,killid))
{
i_canmove++;
qDebug()<<"i_canmove="<<i_canmove<<endl;
SaveStep(id,killid,row,col,steps1);
}
}
其中PositionId()函数实现如下
//返回一个位置上棋子的id,如果该位置上没有棋子,返回-1
int DrawWidget::PositionId(int row,int col)
{
for(int i=0;i<32;i++)
{
if( (chess_man[i].row==row) && (chess_man[i].col==col) && (!chess_man[i].dead))
{
// qDebug()<<"id="<<i<<endl;
return i;
}
}
return -1;
}
PositionId()的返回值在一个位置上没有棋子的情况下会返回-1
int killid=PositionId(row,col);
即killid的值有可能是-1
sameColor()函数实现如下
/*
* 描述:判断两个棋子的颜色是否相同
* 输入:待判断的两个棋子的ID
* 输出:无
* 返回值:false 不相同
* true 相同
* 其他:无
*/
bool DrawWidget::sameColor(int moveid, int killid)
{
if(chess_man[killid].red == chess_man[moveid].red)
{
//颜色相同
return true;
}
else
{
//颜色不同
return false;
}
}
当killid值为-1时,调用
if(sameColor(id,killid))
{
continue;
}
很明显,chess_man[killid].red变成了chess_man[-1].red,数组下标越界,导致程序执行出现了问题。
修改后的sameColor()函数如下
/*
* 描述:判断两个棋子的颜色是否相同
* 输入:待判断的两个棋子的ID
* 输出:无
* 返回值:false 不相同
* true 相同
* 其他:无
*/
bool DrawWidget::sameColor(int moveid, int killid)
{
if(killid == -1)
{
return false;
}
if(chess_man[killid].red == chess_man[moveid].red)
{
//颜色相同
return true;
}
else
{
//颜色不同
return false;
}
}
DEBUG(2)--函数的输入参数要做适当的检查的更多相关文章
- main()函数的输入参数 main(int argc, char** argv)
一般简单的C++程序,main函数的写法都是 int main() {... ; return 0;},但是,如果在运行程序时需要有参数输入,可以是使用将主函数写成int main(int argv, ...
- 编写一个函数func(),将此函数的输入参数(int型)逆序输出显示,如54321 –> 12345,要求使用递归,并且函数体代码不超过8行
public class Test{ //中间变量 private String res = "0"; //方法 public int func(int i){ if(i>0 ...
- python函数的输入参数
http://note.youdao.com/noteshare?id=c2a0a39ee3cae09a62dcbc9f96d04b56
- Kotlin入门(10)七十二变的输入参数
上一篇文章介绍了Kotlin对函数的基本用法,包括函数的定义.输入参数的声明.输出参数的声明等等,这些足够对付简单的场合了.当然了,倘若一门新语言仅仅满足于这些雕虫小技,那也实在没什么前途.既然Kot ...
- C++函数的传入参数是指针的指针(**)的详解
要修改变量的值,需要使用变量类型的指针作为参数或者变量的引用.如果变量是一般类型的变量,例如int,则需要使用int 类型的指针类型int *作为参数或者int的引用类型int&.但是如果变量 ...
- 输入参数varargin
一种特别的输入参数varargin 可以在自定义函数中得到,这种函数支持输入参数的变量的个数.这个参数显在输入参数列表的最后一项,它返回一个单元阵列,所以一个输入实参可以包括任意数目的实参.每一个实参 ...
- GO学习笔记 - 函数名前面是否有输入参数肯定是不一样的!!
在刚接触GO语言时候,我相信你也会有这种困惑,为什么有的函数名前面有输入参数,而一些却没有,它们是否有差别?确实有差别,没有输入参数,是一般的函数:有输入参数,是结构的方法,输入参数叫做“方法接收者” ...
- [语法]C语言中二维数组做输入参数
C语言中二维数组做输入参数时, 可以同时指定各维长度, 可以只指定第二维的长度, 不可以只指定第一维的长度, 不可以各维长度都不指定. 一句话总结:要指定至少指定第二维,都不指定是不行的. 具体栗子如 ...
- Matlab中 awgn 函数输入参数带有‘measured’ 时snr的含义
MATLAB中awgn 函数可以为输入信号x 添加一定大小的噪声. out = awgn(in,snr,'measured'); 是一种常见的使用方法,意思是在添加噪声前先测量一下输入信号的功率,再 ...
随机推荐
- windows composer 安装,使用新手入门
一.前期准备: 1.下载安装包,https://getcomposer.org/download/ 2.在php.ini文档中打开extension=php_openssl.dll 3.下载php_s ...
- JVM垃圾回收算法及分代垃圾收集器
一.垃圾收集器的分类 1.次收集器 Scavenge GC,指发生在新生代的GC,因为新生代的Java对象大多都是朝生夕死,所以Scavenge GC非常频繁,一般回收速度也比较快.当Eden空间不足 ...
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)
ARM架构: 由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7: 一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...
- opencv学习之路(7)、访问图像像素
一.动态地址访问 #include <opencv2/opencv.hpp> #include<iostream> using namespace cv; using name ...
- Stanford CS231n实践笔记(课时14卷积神经网络详解 上)
本课我们主要来研究一个"浏览器中的卷积神经网络" 这只是一个展示项目,但是能够帮助直观地看到一些东西 地址:https://cs.stanford.edu/people/karpa ...
- 20165310 《Java程序设计》课程总结
20165310 <Java程序设计>课程总结 一.每周作业及实验报告博客链接汇总 预备作业一:我期望的师生关系 20165310 我期望的师生关系 预备作业二:学习基础和C语言基础调查 ...
- QT---实现舒尔特方格(零基础入门)
按照之前说的,加上舒尔特方格,读者还可以自行将此游戏做成APP放到手机上,后面还有贪吃蛇,Java版的飞机大战,五子棋,各类游戏会不断加上来的,当然,会免费附加源代码! 读者可以去4399去玩一下,可 ...
- ODAC(V9.5.15) 学习笔记(四)TMemDataSet (2)
2.索引与过滤 名称 类型 说明 IndexFieldNames string 设置排序字段列表,每个字段之间通过分号分割.每个字段后可以有以下几种排序选项: ASC 升序 DESC ...
- noip模拟【service】
service [问题描述] 一家公司为它在各地的用户提供服务,公司有三名负责这项工作的员工,分别编号为1,2,3,服务的地点有n个,分别编号为1,2,3,...n,把从编号为p的服务地点直接到达编号 ...
- (转)Swagger2 & Postman工具使用
(二期)7.swagger2与postman [课程七]swagge...tman.xmind0.3MB [课程七预习]sw...tman.xmind31.3KB 随着互联网技术的发展,现在的网站架构 ...