2016-06-24 4 views
-2

Ich habe die folgende Funktion in C++Wie mit Doppel * Zeiger verwenden push_back

void LocatePulseEdges(int points, double* signal_x, double* signal_y, double* derivative, double threshold, double* left_edge, double* right_edge){ 
    for (int i=0; i<points; i++){ 
     if(signal_y[i]<threshold){ 
      left_edge.push_back(signal_x[i]); 
     } 
    } 
} 

Als ich es kompilieren, erhalte ich die Fehler

In function ‘void LocatePulseEdges(int, double*, double*, double*, double, double*, double*)’: 
error: request for member ‘push_back’ in ‘left_edge’, which is of non-class type ‘double*’ 

Da ich ein Neuling bin in C++ und ich natürlich, versuchen, über Zeiger zu lernen und wie man sie verwendet, kann ich nicht verstehen, warum ich push_back nicht verwenden kann.

Ich habe auch versucht (*left_edge) oder (*signal_y[i]) zu verwenden, aber da es nicht richtig zu erwarten war ...

Jede Idee oder Hilfe wäre mehr als willkommen sein!

EDIT

ich den Code geändert als

void LocatePulseEdges(int points, double* signal_x, double* signal_y, double* derivative, double threshold, vector<double> left_edge, vector<double> right_edge){ 
    for (int i=0; i<points; i++){ 
     if(signal_y[i]<threshold){ 
      left_edge.push_back(signal_x[i]); 
     } 
    } 
} 

Dann in meinem Code folgt nenne ich die Funktion wie diese

void Analyze(unsigned int first_run, unsigned int last_run, unsigned int last_segment){ 
    double* x   = new double[points];   // SIZE limited only by OS/Hardware 
    double* y   = new double[points]; 
    double* derivative = new double[points]; 
    std::vector<double> left_edge; 
    std::vector<double> right_edge; 

    Function_to_Fill_X_and_Y_and_derivative(); 

    LocatePulseEdges(points, x, y, derivative, -0.5*RMS, left_edge, right_edge); 


} 

Obwohl ich keine Kompilierungsfehler erhalten, das Programm stürzt ab, sobald die Funktion aufgerufen wird.

+0

'double *' ist ein eingebauter Typ, es hat keine Mitglieder. Vielleicht möchtest du wie 'left_edge [any_index] = signal_x [i];'. – songyuanyao

+1

'left_edge' ist kein Container. –

+0

@songyuanyao: Danke für deinen Kommentar! Die Sache ist, dass 'signal_x.Size()' ziemlich groß ist (d. H. ~ 1e7), daher dachte ich daran, 'push_back' zu verwenden, um etwas Speicherplatz im Speicher zu sparen. – Thanos

Antwort

3

Das Problem ist, dass Sie left_edge verwenden, als ob es ein Behälter, wie ein list oder vector waren, und es ist nur ein double *, dh ein Zeiger auf eine double, oder vielleicht (wahrscheinlich ist das von wo es die Verwirrung kommt) ein Array von double 's. Selbst wenn es Letzteres ist, können Sie Elemente auf diese Weise nicht hinzufügen, Arrays sind in der Länge festgelegt. Schließlich müssen Sie sich die Länge jedes Arrays merken, da C++ das nicht für Sie erledigt.

Die Art und Weise, ein Array zu erweitern ist:

  1. mit neuen mehr Speicherplatz zuweisen,
  2. die Werte aus dem alten Raum zu kopieren,
  3. und die neuen Werte in den neuen Raum hinzuzufügen.

So zum Beispiel sagen, dass Sie mit einem Element Array erstellen x:

double * left_edge; 
int length = 1; 
left_edge = new double[ length ]; 
left_edge[ 0 ] = x; 

Dann Sie mehr Speicherplatz benötigen, ein neues Element x:

double * new_space = new double[ length + 1 ]; 

for (int i = 0; i < length; ++i) { 
    new_space[ i ] = left_edge[ i ]; 
} 

new_space[ length ] = x; 
++length; 
delete[] left_edge; 
left_edge = new_space; 

Was genau ist std::vector<double> würde für Sie anrufen push_back(). Das einzige ist, dass Sie es von Anfang an so definieren müssen, und übergeben Sie es als Referenz an die Funktion LocatePulseEdges.

std::vector<double> left_edge; 

Wenn Sie sich nur noch am Ende hinzufügen, dann ist std::vector<> die Antwort. Wenn Sie in die Mitte einfügen, sollten Sie stattdessen std::list<> wählen.

Hoffe, das hilft.

+0

Vielen Dank für Ihre Antwort! Ich habe versucht, es so zu definieren, wie du es beschrieben hast, aber mein Programm bricht ab, obwohl ich keinen Kompilierungsfehler erhalte! Bitte überprüfe meine bearbeitete Frage. – Thanos

1

push_back ist eine Methode der Klasse std :: vector. Sie sollten stattdessen std::vector<double> verwenden. Wenn Sie einen double* verwenden, müssen Sie auf diese Weise tun:

left_egde[index] = signal_x[i] ; 
index++ ; 

mit Index korrekt initialisiert. Dies ist weniger sicher als std :: vector, weil Sie genügend Speicher benötigen zuzuteilen bei der Deklaration hier

double *left_edge = new double[whatever_lenght] ;