函数返回错误的数字C++
我遇到了问题。内部函数“pop”中,int rezultat具有正确的值,但在外部,为0.我不知道C++,但我必须为学校做这件事,花了我2个小时,我不知道我在做什么错误... 请帮忙。函数返回错误的数字C++
#include <iostream>
int rezultat;
struct stosik {
int x;
stosik *next;
};
void push(stosik* &stos, int x) {
stosik* tymczasowy = new stosik;
tymczasowy->x = x;
tymczasowy->next = stos;
stos=tymczasowy;
delete tymczasowy;
}
bool isEmpty(stosik* stos){
return stos != NULL;
}
//[email protected]@@@@@@@@@@@@@@@@@@@@@@
bool pop(stosik* &stos, int rezultat){
if (!isEmpty(stos)) {
return false;
}
stosik* tymczasowy = stos;
rezultat = tymczasowy -> x;
if(stos->next !=NULL){
tymczasowy = stos -> next;
stos=tymczasowy;
}
else {
std::cout << "Nic" << std::endl;
}
// delete tymczasowy;
std::cout <<"Rezultat na koncu dziala funkcji "<<rezultat << std::endl;
return true;
}
bool topEl(stosik* &stos, int* result, int mekeke){
if (isEmpty(stos))
{
return false;
}
*result = stos ->x;
mekeke=*result;
return true;
}
int main(){
stosik* stos_roboczy=NULL; // deklaracja stosu, domyślnie NULL
std::cout << "0 empty, 1 something "<< std::endl;
std::cout << isEmpty(stos_roboczy) << std::endl;
std::cout << "" << std::endl;
push(stos_roboczy, 5);
push(stos_roboczy, 15);
push(stos_roboczy, 25);
std::cout << "0 empty, 1 something<<std::endl;
std::cout << isEmpty(stos_roboczy) << std::endl;
std::cout << "" << std::endl;
//AND HERE @@@@@@@@@@@@@@@@@@@@@@@
pop(stos_roboczy, rezultat);
std::cout <<"Wrong result after function: "<<rezultat << std::endl;
//
// pop(stos_roboczy, rezultat);
// pop(stos_roboczy, rezultat);
//
// std::cout << rezultat << std::endl;
}
你有两个不同的整数这既发生在具有相同的名称:在文件的顶部声明全球rezultat
,以及功能pop()
在参数列表中的函数参数rezultat
。
您将全局rezultat
的值传递给pop()
,然后在该函数内部为函数参数rezultat
分配一个新值。当功能退出时,功能参数rezultat
消失。您没有为全球rezultat
分配新值,因此它具有与以前相同的价值。
如果要将函数内部的变量值发送到外部,请使用return
语句。
如果您将全局命名重命名为其他名称,则应该清除您在两者之间的混淆。
此外,请参阅@ForeverStudent's excellent answer。他发现了一些其他需要查看的问题。
谢谢,它有助于:) – Mulaczos
正确,但没有解决你在推动内存泄漏,你需要重新考虑这个功能 – ForeverStudent
@ForeverStudent *谁*需要重新考虑这个功能(哈哈)?!我只是在解决他所知道的错误。出于这个原因,你的回答比我的好得多。 –
你的代码有很多问题。
首先,你push
函数签名void push(stosik* &stos, int x)
根据您的语义,你很可能希望void push(stosik* stos, int x)
你必须在pop
也体内的签名同样的问题push
你有:
stosik* tymczasowy = new stosik; //allocate on heap, OK
tymczasowy->x = x; //OK
tymczasowy->next = stos;//OK
stos=tymczasowy; //BOTH pointers now point to the same memory
delete tymczasowy;//you are freeing memory for both.
//stos->next is now inaccessible and leaked
最后一行会产生内存泄漏,两个指针都指向相同的位置,并且释放内存。确定你仍然有指针,但它不再指向一个有效的对象实例。
你也正在使用的extern全局变量rezultat
将被初始化为0
现在你pop
函数具有相同名称的形式参数。 这会导致rezultat
引用函数作用域中的变量而不是全局变量。
我建议你避免使用全局变量,但是如果你必须使用它们,至少不要在块范围中覆盖它们。
bool pop(stosik* stos, int rezultat) //valid code, but terrible practice
{
//here rezultat refers to the variable passed in NOT the global
//global variable is still accessible in this scope via ::rezultat
if (!isEmpty(stos))
{
return false;
}
stosik* tymczasowy = stos;
rezultat = tymczasowy -> x;
//this rezultat will be destroyed when this function returns.
...
}
如果你决定要顽皮,使用全局变量,那么你将需要这样做:
bool pop(stosik* stos)
{
if (!isEmpty(stos))
{
return false;
}
stosik* tymczasowy = stos;
rezultat = tymczasowy -> x;
//now this refers to the global variable
...
}
当你想通过一个参数返回一个值,你需要使用一个参考,例如
bool pop(stosik* &stos, int &rezultat){
注意在rezultat
之前的&
。 当您致电pop(stos_roboczy, rezultat);
时,这将在堆栈中引用rezultat
而不是其值。它允许函数将给定的值返回给调用者的变量,而不仅仅是修改局部变量/参数。更多详情请参阅Passing arguments by reference。
你是什么意思错号?你回复真假,你还有什么期望?作为未来的技巧,用英语编程。这是通用编程语言。 –
我的意思是整数“rezultat”。它被声明为全局的,在弹出函数里它有一个由“rezultat = tymczasowy-> x”赋值的值,里面是正确的(25),但是在“main()”的下一行中,值是“0”。像这样:http://imgur.com/j5NtVJI – Mulaczos
我推荐使用调试器和单步执行代码。另外,当每个语句执行时,打印变量值或*观察它们。 –