将一个全局变量当做参数传给函数 函数里面没动这个变量 使用后变为0 为何?

时间:2022-12-12 12:57:01
我的代码是vs2010里面能跑的 建一个console application工程就能跑这个代码

问题出在272行那里

全局int变量ex使用前和使用后的值会自己变掉,使用后总会变成0

即使在那个函数里面,ex对应的参数也在函数的开头和结尾处作了输出 没有改变

帮忙看看是什么原因



#include <iostream>
#include <list>
#include <vector>

using namespace std;

char b[21][21];
bool is_visited[21][21];
int a[21];

struct point{
int x;
int y;
int step;
int point_serial;
};
list<point> work_stack;
vector<point> trash_vector;
vector<point>::iterator trash_vector_iterator;
int trash_count=0;
int for_added,for_compare;
int least_step_total=99999;
int shortest_step;
point start_point_for_sort,end_point_for_sort;

int sx,sy,ex,ey;


void initial_number_group()
{
for(int j=0;j<=20;j++)
{
a[j]=j;
}
}




void swap(int*a,int*b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}

//获得地图,并将地上的垃圾存入垃圾队列
void get_b()
{


string a=".......x.......";
int lenth=15;
int i_in_get_b;
int serial=1;
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[1][i_in_get_b]=a[i_in_get_b-1];
}
a="...o...x....*..";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[2][i_in_get_b]=a[i_in_get_b-1];
}
a=".......x.......";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[3][i_in_get_b]=a[i_in_get_b-1];

}
a=".......x.......";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[4][i_in_get_b]=a[i_in_get_b-1];
}
a=".......x.......";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[5][i_in_get_b]=a[i_in_get_b-1];
}
a="...............";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[6][i_in_get_b]=a[i_in_get_b-1];
}
a="xxxxx.....xxxxx";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[7][i_in_get_b]=a[i_in_get_b-1];
}
a="...............";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[8][i_in_get_b]=a[i_in_get_b-1];
}
a=".......x.......";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[9][i_in_get_b]=a[i_in_get_b-1];
}
a=".......x.......";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[10][i_in_get_b]=a[i_in_get_b-1];
}
a=".......x.......";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[11][i_in_get_b]=a[i_in_get_b-1];
}
a="..*....x....*..";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[12][i_in_get_b]=a[i_in_get_b-1];
}
a=".......x.......";
for(i_in_get_b=1;i_in_get_b<=lenth;i_in_get_b++)
{
b[13][i_in_get_b]=a[i_in_get_b-1];
}

point get_b_tmp_point;

int k_in_get_b,j_in_get_b;
for(k_in_get_b=1;k_in_get_b<=21;k_in_get_b++)
{
for(j_in_get_b=1;j_in_get_b<=21;j_in_get_b++)
{
if( b[k_in_get_b][j_in_get_b]=='*' )
{
get_b_tmp_point.point_serial=serial;
serial++;
get_b_tmp_point.x=k_in_get_b;
get_b_tmp_point.y=j_in_get_b;
trash_vector.push_back(get_b_tmp_point);
}
}
}



}


//获得地图上两点之间的最短路径
int get_shortest_path(int start_x,int start_y,int end_x,int end_y)
{
cout<<"函数开始处end_x= "<<end_x<<endl;
point start_point,end_point,work_point,add_point;
start_point.x=start_x;
start_point.y=start_y;
start_point.step=0;

end_point.x=end_x;
end_point.y=end_y;
shortest_step=666666;


//初始化is_visited数组
int i_in_get_shortest_path,j_in_get_shortest_path;
for(i_in_get_shortest_path=1;i_in_get_shortest_path<=21;i_in_get_shortest_path++)
{
for(j_in_get_shortest_path=1;j_in_get_shortest_path<=21;j_in_get_shortest_path++)
{
is_visited[i_in_get_shortest_path][j_in_get_shortest_path]=false;
}
}

work_stack.push_front(start_point);
work_point=start_point;
//is_visited[work_point.x][work_point.y]=true;
while(!work_stack.empty())
{
//cout<<"跑了一次"<<endl;

if(work_point.x+1==end_x&&work_point.y==end_y||work_point.x-1==end_x&&work_point.y==end_y||work_point.x==end_x&&work_point.y+1==end_y||work_point.x==end_x&&work_point.y-1==end_y)
{
//cout<<work_point.x<<"   "<<work_point.y<<endl;
shortest_step=work_point.step+1;
work_stack.clear();
break;
}else
{
if(work_point.x+1>=1&&work_point.x+1<=20&&work_point.y>=1&&work_point.y<=20&&is_visited[work_point.x+1][work_point.y]==false&&b[work_point.x+1][work_point.y]=='.')
{
//cout<<"进入1"<<endl;
is_visited[work_point.x+1][work_point.y]=true;
add_point.step=work_point.step+1;
add_point.x=work_point.x+1;
add_point.y=work_point.y;
work_stack.push_back(add_point);
}

if(work_point.x-1>=1&&work_point.x-1<=20&&work_point.y>=1&&work_point.y<=20&&is_visited[work_point.x-1][work_point.y]==false&&b[work_point.x-1][work_point.y]=='.')
{
//cout<<"进入2"<<endl;
is_visited[work_point.x-1][work_point.y]=true;
add_point.step=work_point.step+1;
add_point.x=work_point.x-1;
add_point.y=work_point.y;
work_stack.push_back(add_point);
}

if(work_point.x>=1&&work_point.x<=20&&work_point.y+1>=1&&work_point.y+1<=20&&is_visited[work_point.x][work_point.y+1]==false&&b[work_point.x][work_point.y+1]=='.')
{
//cout<<"进入3"<<endl;
is_visited[work_point.x][work_point.y+1]=true;
add_point.step=work_point.step+1;
add_point.x=work_point.x;
add_point.y=work_point.y+1;
work_stack.push_back(add_point);
}

if(work_point.x>=1&&work_point.x<=20&&work_point.y-1>=1&&work_point.y-1<=20&&is_visited[work_point.x][work_point.y-1]==false&&b[work_point.x][work_point.y-1]=='.')
{
//cout<<"进入4"<<endl;
is_visited[work_point.x][work_point.y-1]=true;
add_point.step=work_point.step+1;
add_point.x=work_point.x;
add_point.y=work_point.y-1;
work_stack.push_back(add_point);
}
work_point=*work_stack.begin();
work_stack.pop_front();
}
//cout<<"=============="<<work_point.x<<"   "<<work_point.y<<"=============="<<endl;
//for(i_in_get_shortest_path=1;i_in_get_shortest_path<=13;i_in_get_shortest_path++)
//{
// for(j_in_get_shortest_path=1;j_in_get_shortest_path<=21;j_in_get_shortest_path++)
// {
// if(is_visited[i_in_get_shortest_path][j_in_get_shortest_path])
// {
// cout<<".";
// }else if(b[i_in_get_shortest_path][j_in_get_shortest_path]=='x')
// {
// cout<<"x";
// }
// else if(!is_visited[i_in_get_shortest_path][j_in_get_shortest_path])
// cout<<" ";
//
// }
// cout<<i_in_get_shortest_path<<endl;
//}
//cout<<"================================================================"<<endl;
}

cout<<"函数开始处end_x= "<<end_x<<endl;
return shortest_step;

}


void sort(int start,int end)
{
 
if(start>end)
{

for_compare=0;
sx=2;
sy=4;
for(int i_in_sort=1;i_in_sort<=trash_count;i_in_sort++)
{

end_point_for_sort=trash_vector[a[i_in_sort]-1];

ex=end_point_for_sort.x;
ey=end_point_for_sort.y;



//问题出在这里,明明没有传值进去,在get_shortest_path函数内也没有改动过ex,为什么调用get_shortest_path函数之后ex会变为0======================================================================================================================
cout<<"计算之前 ex= "<<ex<<endl;

for_added += get_shortest_path(sx,sy,ex,ey);

cout<<"计算完后 ex= "<<ex<<endl<<endl<<endl;
//============================================================================================================================================================================================================================================






sx=ex;
sy=ey;
//cout<<"for_added= "<<for_added<<endl;
for_compare+=for_added;
}
if(for_compare<least_step_total)
{
least_step_total=for_compare;
}
//cout<<"当前为"<<for_compare<<endl;
//cout<<"当前最小为"<<least_step_total<<endl<<endl;

return;
}
for(int i=start;i<=end;i++)
{
swap(&a[i],&a[start]);
sort(start+1,end);
swap(&a[i],&a[start]);
}
}



int main(void)
{

initial_number_group();
//sort(6,9);

get_b();

trash_count=trash_vector.size();

sort(1,3);



//cout<<get_shortest_path(2,4,12,3)<<endl;
//cout<<get_shortest_path(12,3,12,13)<<endl;
//cout<<get_shortest_path(12,13,2,13)<<endl;

system("pause");
return 0;
}

13 个解决方案

#1


一般来说,ex 所在的内存被覆盖了吧
你跟踪函数内部的那个ex没用, 那个只是副本而已。

你可以通过跟踪ex的内存地址,看看它的内容什么时候被改变。

#2


引用 1 楼 relaxisland 的回复:
一般来说,ex 所在的内存被覆盖了吧
你跟踪函数内部的那个ex没用, 那个只是副本而已。

你可以通过跟踪ex的内存地址,看看它的内容什么时候被改变。
全局函数,内存地址应该是固定的

#3


全局变量为什么要当参数传递呢?
如果当参数传递的话,试试把全局变量赋值给一个局部变量(保证生命周期)

#4


引用 3 楼 max_min_ 的回复:
全局变量为什么要当参数传递呢?
如果当参数传递的话,试试把全局变量赋值给一个局部变量(保证生命周期)

我没表达清楚 我只是把全局变量的副本传进去了

比如 int a;是全局变量

然后一个函数是这样的 void func(int b){...}

调用这个函数的时候func(a) 这时只传了a的副本进去

#5


引用 1 楼 relaxisland 的回复:
一般来说,ex 所在的内存被覆盖了吧
你跟踪函数内部的那个ex没用, 那个只是副本而已。

你可以通过跟踪ex的内存地址,看看它的内容什么时候被改变。

            cout<<"计算之前 ex= "<<ex<<endl;               for_added += get_shortest_path(sx,sy,ex,ey);               cout<<"计算完后 ex= "<<ex<<endl<<endl<<endl; 

函数里面是没动ex的  也没把地址传进去  怎么调用完函数ex就变成0了  我怀疑是编译器的问题

#6


没发现呀,难道和被注释的代码有关?

#7


code::block 和VC10 的结果不一样哦!
























#8



























引用 7 楼 lm_whales 的回复:
code::block 和VC10 的结果不一样哦!

你的控制台输出里面 ex在调用函数以后有没有变成0?

#9


引用 6 楼 lm_whales 的回复:
没发现呀,难道和被注释的代码有关?

被注释掉的 肯定不会起作用了

#10


一行行删你的代码,把无关代码全部删掉后,再分析是什么原因。

#11


强打精神看了两眼代码, 我能想到的唯一可能的原因就是哪里出现数组/指针访问越界,把ex的内存给覆盖成0了。但你段代码实现是太长了(单个函数最好不要超过一屏,好吧,绝对不能超过一屏),蛋疼的紧,所以基本纯属猜测。另外我有种想强调c/c++的数组索引从0开始的感觉,不过也不确定是不是我眼花了。  至于楼主这么无节操的使用全局变量的事,我只说一点,真难读啊,总有种往回翻篇又懒得翻的感觉。 另外变更命名不可谓不长,但光长没用了,那个全局的a数组到底是什么意思啊? 什么叫a呀。。。 

引用 10 楼 u012908616 的回复:
一行行删你的代码,把无关代码全部删掉后,再分析是什么原因。

#12


你的代码里有大量的数组下标越界访问. 数组下标是0到N-1, 不是1到N!!!!!!

#13


引用 1 楼 relaxisland 的回复:
一般来说,ex 所在的内存被覆盖了吧
你跟踪函数内部的那个ex没用, 那个只是副本而已。

你可以通过跟踪ex的内存地址,看看它的内容什么时候被改变。


大哥  还是你说中了啊  按你说的方法  发现在165行那里给动的ex
然后一看  is_visited数组标定义的是从0-20 然后165行那里的循环条件包含21了 把直接把别人给改了

#1


一般来说,ex 所在的内存被覆盖了吧
你跟踪函数内部的那个ex没用, 那个只是副本而已。

你可以通过跟踪ex的内存地址,看看它的内容什么时候被改变。

#2


引用 1 楼 relaxisland 的回复:
一般来说,ex 所在的内存被覆盖了吧
你跟踪函数内部的那个ex没用, 那个只是副本而已。

你可以通过跟踪ex的内存地址,看看它的内容什么时候被改变。
全局函数,内存地址应该是固定的

#3


全局变量为什么要当参数传递呢?
如果当参数传递的话,试试把全局变量赋值给一个局部变量(保证生命周期)

#4


引用 3 楼 max_min_ 的回复:
全局变量为什么要当参数传递呢?
如果当参数传递的话,试试把全局变量赋值给一个局部变量(保证生命周期)

我没表达清楚 我只是把全局变量的副本传进去了

比如 int a;是全局变量

然后一个函数是这样的 void func(int b){...}

调用这个函数的时候func(a) 这时只传了a的副本进去

#5


引用 1 楼 relaxisland 的回复:
一般来说,ex 所在的内存被覆盖了吧
你跟踪函数内部的那个ex没用, 那个只是副本而已。

你可以通过跟踪ex的内存地址,看看它的内容什么时候被改变。

            cout<<"计算之前 ex= "<<ex<<endl;               for_added += get_shortest_path(sx,sy,ex,ey);               cout<<"计算完后 ex= "<<ex<<endl<<endl<<endl; 

函数里面是没动ex的  也没把地址传进去  怎么调用完函数ex就变成0了  我怀疑是编译器的问题

#6


没发现呀,难道和被注释的代码有关?

#7


code::block 和VC10 的结果不一样哦!
























#8



























引用 7 楼 lm_whales 的回复:
code::block 和VC10 的结果不一样哦!

你的控制台输出里面 ex在调用函数以后有没有变成0?

#9


引用 6 楼 lm_whales 的回复:
没发现呀,难道和被注释的代码有关?

被注释掉的 肯定不会起作用了

#10


一行行删你的代码,把无关代码全部删掉后,再分析是什么原因。

#11


强打精神看了两眼代码, 我能想到的唯一可能的原因就是哪里出现数组/指针访问越界,把ex的内存给覆盖成0了。但你段代码实现是太长了(单个函数最好不要超过一屏,好吧,绝对不能超过一屏),蛋疼的紧,所以基本纯属猜测。另外我有种想强调c/c++的数组索引从0开始的感觉,不过也不确定是不是我眼花了。  至于楼主这么无节操的使用全局变量的事,我只说一点,真难读啊,总有种往回翻篇又懒得翻的感觉。 另外变更命名不可谓不长,但光长没用了,那个全局的a数组到底是什么意思啊? 什么叫a呀。。。 

引用 10 楼 u012908616 的回复:
一行行删你的代码,把无关代码全部删掉后,再分析是什么原因。

#12


你的代码里有大量的数组下标越界访问. 数组下标是0到N-1, 不是1到N!!!!!!

#13


引用 1 楼 relaxisland 的回复:
一般来说,ex 所在的内存被覆盖了吧
你跟踪函数内部的那个ex没用, 那个只是副本而已。

你可以通过跟踪ex的内存地址,看看它的内容什么时候被改变。


大哥  还是你说中了啊  按你说的方法  发现在165行那里给动的ex
然后一看  is_visited数组标定义的是从0-20 然后165行那里的循环条件包含21了 把直接把别人给改了