2016-01-13 210 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