2017-06-12 156 views
0

首先感謝給我一個這樣的手。我不是C++專家,但我已經在C做了一些工作。我的代碼問題是它不會正確顯示返回的數組值。C++返回的數組值不正確

一般來說,我的程序試圖做的是評估一個函數F(x),以表格格式顯示它,並找到它的最小值和最大值。我發現盡一切辦法,但是當我想顯示陣列F(X)的返回值,它在某種程度上得到了distorted.The第一個值總是例如像

cout << *(value+0) <<endl; 

但下一個值正確與假設的f(x)不一樣。如果我的代碼沒有達到合適的標準,請提前提前打招呼,但是我現在已經把這個包裹了一段時間了。

My Full Code

#include <iostream> 
#include <fstream> 
#include <cmath> 
#include <iomanip> 
#include <string> 
#include <stdlib.h> 

using namespace std; 
float *evaluate(); 
void display(); 
void Min_Max(float *); 
int main() 
{ 
float *p; 


    evaluate(); 
    display(); 

cin.get(); 

p = evaluate(); 
Min_Max(p); 


    return 0; 
} 

float *evaluate() 
{ 
    ofstream Out_File("result.txt"); 
    int n=30; 
    float x [n]; 
    float fx[n]; 
    float interval = ((4-(-2))/0.2); 
    x[0]= -2.0; 

    for(n=0;n <= interval;n++) 
    { 
     fx[n] = 4*exp((-x[n])/2)*sin((2*x[n]- 0.3)*3.14159/180); 
     x[n+1] = x[n] + 0.2; 

     if (Out_File.is_open()) 
     { 
      Out_File <<setprecision(5)<<setw(8)<<showpoint<<fixed<< x[n]; 
      Out_File << "\t\t"<<setprecision(5)<<setw(8)<<showpoint<<fixed<<fx[n]<<endl; 
     } 
     else cout << "Unable to open file"; 
    } 
    Out_File.close(); 
return fx; 
} 

void display() 
{ 
     ifstream inFile; 
    inFile.open("result.txt"); 
    string line; 
    cout << " x\t\t\t f(x)"<<endl; 
    cout << "_______________________________________"<<endl; 
     while(getline (inFile,line)) 
     { 
      cout<<line<<endl; 
     } 

    inFile.close(); 

} 

void Min_Max(float *value) 
{ 
    int a=0; 
    for(a=0;a<=30;a++){ 
     cout << *(value+a) <<endl; 
     *value =0;} 
} 

回答

1

我明白了,你通過p給你的函數Min_Max。其中p是指向數組入口點的指針。該數組在另一個函數evaluate中創建爲local variable。這是行不通的,因爲只要evaluate完成,它的所有local variables(如fx數組)都會被破壞,並且返回的指針會指向「無」。

在這種情況下,您可以使用heap內存(使用new運算符)分配fx。但不要忘記隨後釋放它。

此外,尋找here

+0

原諒我,但我不完全理解你的答案,英語不是我的第一語言,但讓我嘗試去了解它。你說,指針p只能訪問數組的第一個值?堆內存對我來說是新的,我已經看到了你給的例子,但我不明白如何使用它與我的代碼。最後,你的意思是「不要忘記隨後釋放它」。 –

+0

你知道'變量作用域'嗎?這是確切的問題。當你創建一個局部變量時,它只存在於這些括號內{}'。當一個程序走出括號時,該變量不再存在。所以,你在括號內創建一個變量,將一個指針傳遞給外部,一旦你退出函數,這個指針就什麼也不指向。關於'堆內存',你可以繼續前進,谷歌'新'操作符,我相信你一開始就會發現其他所有相關的東西:) – Sam

+0

更明確的一點:你在函數內部創建一個變量'fx', evaluate'。一旦函數開始工作,'fx'會立即創建,並在函數停止工作後立即死亡。所以,當函數正在工作時,你把內存地址'fx'(這只是一個數字)並從函數中返回。在'main'函數中,將變量'p'分配給內存地址。由於'evaluate'已經停止工作,所有'local變量'包括'fx'在這個時間點都不存在。 'p'具有創建'fx'的內存地址,但現在這個地址沒有任何內容。 – Sam