2017-06-12 4 views
0

First of thanks für die Hand mit diesem. Ich bin kein Experte in C++, aber ich habe etwas Arbeit in C gemacht. Mein Code-Problem ist, dass es den zurückgegebenen Array-Wert nicht korrekt anzeigen würde.C++ der zurückgegebene Array-Wert ist nicht korrekt

Im Allgemeinen versucht mein Programm, eine Funktion F (x) auszuwerten, sie in einem Tabellenformat anzuzeigen und ihr Minimum und Maximum zu finden. Ich habe Wege finden, um all das zu tun, aber wenn ich den Rückgabewert von Array F (x) angezeigt werden soll es irgendwie distorted.The ersten Wert bekam immer korrekt zum Beispiel wie

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

aber die nächsten der Wert ist nicht das gleiche wie die angenommene f (x). Sorry im Voraus, wenn mein Code nicht den richtigen Standard ist, aber ich habe meinen Kopf für eine Weile jetzt eingewickelt.

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

Antwort

1

Ich sehe, übergeben Sie p an Ihre Funktion Min_Max. Dabei ist ein Zeiger auf einen Eintrittspunkt eines Arrays. Dieses Array wird als local variable in einer anderen Funktion evaluate erstellt. Das funktioniert nicht, denn sobald evaluate beendet ist, werden alle local variables, wie das fx Array, zerstört und der Zeiger, den Sie zurückgeben, zeigt dann auf "nichts".

In diesem Fall können Sie 10 Speicher (new Operator) verwenden, um die fx zu reservieren. Aber vergiss nicht, es danach zu befreien.

Auch schauen here

+0

Vergib mir, aber ich verstehe nicht ganz Ihre Antwort und Englisch ist nicht meine erste Sprache, aber lassen Sie mich versuchen, es zu verstehen. Sie sagen, dass der Zeiger p nur auf den ersten Wert des Arrays zugreifen kann? Heap Memory ist neu für mich und ich habe das Beispiel gesehen, das Sie gegeben haben, aber ich verstehe nicht, wie ich es mit meinem Code verwenden kann. Zuletzt, was meinst du mit "vergiss nicht, es danach zu befreien". –

+0

Kennen Sie den variablen Bereich? Das ist das genaue Problem hier. Wenn Sie eine 'lokale Variable 'erstellen, existiert sie nur innerhalb dieser Klammern' {} '. Wenn ein Programm die Klammern verlässt, existiert die Variable nicht mehr. Sie erstellen also eine Variable innerhalb der Klammern, übergeben einen Zeiger nach außen und sobald Sie die Funktion verlassen, zeigt dieser Zeiger auf nichts. Und über 'heap memory' gehst du einfach weiter und google' new' operator, ich bin mir sicher, dass du alles andere finden wirst, sobald du beginnst :) – Sam

+0

Noch genauer: Du erstellst eine Variable 'fx' in der Funktion' auswerten. 'fx' erzeugt, sobald die Funktion zu arbeiten beginnt und stirbt, sobald die Funktion aufhört zu arbeiten. Also, während die Funktion arbeitet, nehmen Sie die Speicheradresse von 'fx' (die nur eine Zahl ist) und geben Sie sie von der Funktion zurück. In der Hauptfunktion weisen Sie der Variablen "p" diese Speicheradresse zu. Da 'evaluate' nicht mehr funktioniert, existieren zu diesem Zeitpunkt noch nicht alle' lokalen Variablen', einschließlich 'fx'. 'p' hat die Speicheradresse, bei der das' fx' erzeugt wurde, aber jetzt gibt es "nichts" an dieser Adresse. – Sam

Verwandte Themen