函数返回错误的数字C ++

时间:2016-01-13 20:09:02

标签: c++ function

我遇到了问题。在内部函数“pop”中,int rezultat具有正确的值,但在外面,是0.我不知道C ++,但我必须在学校这样做,它花了我2个小时,我不知道我做错了什么...请帮忙。

#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;
}

//HERE@@@@@@@@@@@@@@@@@@@@@@@
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;

}

3 个答案:

答案 0 :(得分:4)

您有两个不同的整数,它们碰巧具有相同的名称:在文件顶部声明的全局<do something here>,以及函数{{1的参数列表中的函数参数rezultat }}。

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

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

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

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

答案 1 :(得分: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

最后一行创建了内存泄漏,两个指针都指向同一个位置,并释放内存。确定你仍然有指针,但它不再指向有效的对象实例。

此外,您正在使用将初始化为0的外部全局变量rezultat

现在,您的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
 ...
 }

答案 2 :(得分:1)

如果要通过参数返回值,则需要使用引用,例如

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

注意&之前的rezultat。 当您调用pop(stos_roboczy, rezultat);时,这将在堆栈上引用rezultat而不是其值。它允许函数将给定值返回给调用者的变量,而不是仅修改局部变量/参数。

有关详细信息,另请参阅Passing arguments by reference