2016-01-13 174 views
-6

我遇到了问题。内部函数“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; 

} 
+2

你是什么意思错号?你回复真假,你还有什么期望?作为未来的技巧,用英语编程。这是通用编程语言。 –

+0

我的意思是整数“rezultat”。它被声明为全局的,在弹出函数里它有一个由“rezultat = tymczasowy-> x”赋值的值,里面是正确的(25),但是在“main()”的下一行中,值是“0”。像这样:http://imgur.com/j5NtVJI – Mulaczos

+0

我推荐使用调试器和单步执行代码。另外,当每个语句执行时,打印变量值或*观察它们。 –

回答

4

你有两个不同的整数这既发生在具有相同的名称:在文件的顶部声明全球rezultat,以及功能pop()在参数列表中的函数参数rezultat

您将全局rezultat的值传递给pop(),然后在该函数内部为函数参数rezultat分配一个新值。当功能退出时,功能参数rezultat消失。您没有为全球rezultat分配新值,因此它具有与以前相同的价值。

如果要将函数内部的变量值发送到外部,请使用return语句。

如果您将全局命名重命名为其他名称,则应该清除您在两者之间的混淆。

此外,请参阅@ForeverStudent's excellent answer。他发现了一些其他需要查看的问题。

+0

谢谢,它有助于:) – Mulaczos

+0

正确,但没有解决你在推动内存泄漏,你需要重新考虑这个功能 – ForeverStudent

+0

@ForeverStudent *谁*需要重新考虑这个功能(哈哈)?!我只是在解决他所知道的错误。出于这个原因,你的回答比我的好得多。 –

2

你的代码有很多问题。

首先,你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 
... 
} 
1

当你想通过一个参数返回一个值,你需要使用一个参考,例如

bool pop(stosik* &stos, int &rezultat){ 

注意在rezultat之前的&。 当您致电pop(stos_roboczy, rezultat);时,这将在堆栈中引用rezultat而不是其值。它允许函数将给定的值返回给调用者的变量,而不仅仅是修改局部变量/参数。更多详情请参阅Passing arguments by reference