设计了一个间接递归的方法,传不出参数来,请大家帮忙看看怎么回事?

csliusanpidn 2012-05-30 09:48:56
问题描述,我定义了间接递归的方法,现在调用这个方法的时候想检查下是否有错误,但是明明报了错误,我却不能将错误变量传出来,问题也标在相应的代码处,请大家帮忙看看!

设计1:方法我作为void类型,通过一个传一个bool变量去接收错误,想实现有错误时,方法停止,返回bool变量的值:

bool errorjudge=false;//定义错误变量
int par;//带入的参数,不用管

//调用方法
adjustFollowBars(par,errorjudge);
adjustSameRowBars(par,errorjudge);

if(errorjudge)
{
//问题:errorjudge始终为false,这是为什么???
}



//方法定义
private void adjustFollowBars(int a[n],bool judge)
{

//调用
adjustFollowBars(a[n-1],judge);
adjustSameRowBars(a[n-1],judge);

}

//方法定义
private void adjustSameRowBars(int a[n],bool judge)
{

//if(错误判定逻辑)
{
judge=true;//调试时可以走到这里
messagebox.show("有错误");
return;//有错误我想终止该方法运行,是否可以实现?
}

adjustSameRowBars(a[n-1],judge);
adjustFollowBars(a[n-1],judge);


}

设计2:方法设计为不带bool参数的,将其自身设置为bool类型,如果有错误,方法返回bool值;

bool errorjudge=false;//定义错误变量
int par;//带入的参数,不用管

//调用方法
errorjudge=adjustFollowBars(par);//接收返回值,看是否有错误
adjustSameRowBars(par);

if(errorjudge)
{
//问题:errorjudge始终为false,这是为什么??????
}



//方法定义
private bool adjustFollowBars(int a[n])
{

//调用
adjustFollowBars(a[n-1]);
adjustSameRowBars(a[n-1]);
return false;//没有错误
}

//方法定义
private bool adjustSameRowBars(int a[n])
{

//if(错误判定逻辑)
{

messagebox.show("有错误");//调试时可以走到这里
return true;//有错误返回值设置为true,是否可以实现?
}

adjustSameRowBars(a[n-1]);
adjustFollowBars(a[n-1]);

return false;//没有错误
}
...全文
121 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
__天涯寻梦 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

设计1:大家说的对,需要加ref,才能使形参的变化反映到实参里面去。谢谢!

设计2:我能运行到该段代码
//if(错误判定逻辑)
{
messagebox.show("有错误");//调试时可以走到这里
return true;//有错误返回值设置为true,是否可以实现?
}
应该就能返回true了吧?
为什么errorjudge没有接收到???
errorjudge=a……
[/Quote]
你的方法
private bool adjustFollowBars(int a[n])
{
//调用
adjustFollowBars(a[n-1]);
adjustSameRowBars(a[n-1]);
return false;//没有错误
}

没有地方返回 true
csliusanpidn 2012-05-31
  • 打赏
  • 举报
回复
设计1:大家说的对,需要加ref,才能使形参的变化反映到实参里面去。谢谢!

设计2:我能运行到该段代码
//if(错误判定逻辑)
{
messagebox.show("有错误");//调试时可以走到这里
return true;//有错误返回值设置为true,是否可以实现?
}
应该就能返回true了吧?
为什么errorjudge没有接收到???
errorjudge=adjustFollowBars(par)
csliusanpidn 2012-05-31
  • 打赏
  • 举报
回复
//对于设计1,高手说的正确,是要加上ref,下面是我的理解,高手帮忙检查下是不是这样???
因为:ref 关键字使参数按引用传递。 其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。所以,只要是我传递的值类型,无论是bool,int,folat...如果想形参的变化反映到实参,都要使用ref???


设计2:会执行到有错误的地方
//if(错误判定逻辑)
{
messagebox.show("有错误");//调试时可以走到这里
return true;//有错误返回值设置为true,是否可以实现?
}
此时返回true啊,
为什么我errorjudge没有接收到???
errorjudge=adjustFollowBars(par);
孤心浪女 2012-05-30
  • 打赏
  • 举报
回复
设计一中bool是值类型数据,做参数传递在被调函数中是不会改变传入时的值的,需要采用ref修饰参数作为地址传递

设计二中adjustFollowBars返回值必定是false,errorjudge=adjustFollowBars(par),那么errorjudge为false有什么奇怪的
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
这里应该不是变量的问题,我将bool类型改为值类型 int型来盘算是否有错误,还是没改变该变量的初值!
[/Quote]
假如代码
bool errorjudge = false;
adjustFollowBars(par,errorjudge);
if (errorjudge) // errorjudge 绝对不会变成 true
{
}
csliusanpidn 2012-05-30
  • 打赏
  • 举报
回复
这里应该不是变量的问题,我将bool类型改为值类型 int型来盘算是否有错误,还是没改变该变量的初值!
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
bool 是值类型,传递时会复制一份,改成传递地址
private void adjustFollowBars(int a[n],ref bool judge)
这数组写法不像 C# 的啊


数组这个是写错了,我想表示这个递归的意思,我实际代码不是用的这个!不过你说的我还是没理解什么意思!
private void adjustFollowBars(int[……
[/Quote]
bool 传递到方法里后,方法里使用的是一个副本了,对那个副本的修改,外部的不会改变的,所以加上 ref 修饰符,编译时就把内存地址传进去,方法内和方法外看起来值就一起变了。
csliusanpidn 2012-05-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
bool 是值类型,传递时会复制一份,改成传递地址
private void adjustFollowBars(int a[n],ref bool judge)
这数组写法不像 C# 的啊
[/Quote]

数组这个是写错了,我想表示这个递归的意思,我实际代码不是用的这个!不过你说的我还是没理解什么意思!
private void adjustFollowBars(int[] a,ref bool judge)
__天涯寻梦 2012-05-30
  • 打赏
  • 举报
回复
bool 是值类型,传递时会复制一份,改成传递地址
private void adjustFollowBars(int a[n],ref bool judge)
这数组写法不像 C# 的啊

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧