2016-06-28 21 views
-3

Wie kann ich einen struct zu einem anderen kopieren. Momentan wird der folgende Code kompiliert, stürzt jedoch zur Laufzeit ab. Gibt es einen besseren Weg, dies zu tun?Duplicate Struct in C++

struct Trip 
{ 
    int startX; 
    int startY; 
    int endX; 
    int endY; 
    int suppress 
}; 

struct Feedback 
{ 
    int startX; 
    int startY; 
    int endX; 
    int endY; 
    int suppress; 
}; 

vector<Trip> tripList; 
vector<Trip> TTMx[288]; 
TTMX[0] = &tripList; 
vector<Feedback> Tripfeed[288]; 

    for(time = 0; time < 288; time++){ 
      for (int trp=0; trp < tripList.size(); trp++) { 

       Tripfeed[time][trp].startX = tripList[trp].startX; 
       Tripfeed[time][trp].startY = tripList[trp].startY; 
       Tripfeed[time][trp].endX = tripList[trp].endX; 
       Tripfeed[time][trp].endY = tripList[trp].endY; 
       Tripfeed[time][trp].suppress = tripList[trp].suppress; 
    } 
    } 
+4

Sie haben ein Array von 288 leeren Vektoren. Um Elemente zu einem Vektor hinzuzufügen, verwenden Sie 'push_back'. –

+0

Wie push_back verwenden, um Daten zum Objekt startX hinzuzufügen? – Far

+1

Was ist "TripList"? Sie sollten in der Lage sein, diese eine Anweisung innerhalb Ihrer for-Schleifen zu verwenden. 'Tripfeed [time] .push_back (tripList [trp])' –

Antwort

0

Tripfeed als ein Array von 288 leeren Vektoren deklarierte . Sie sind leer, weil dies das Verhalten des Standardkonstruktors der Vektorklasse ist. Es stürzt aufgrund einer Zugriffsverletzung ab, wenn Sie versuchen, auf Elemente dieser Vektoren zuzugreifen, da die Vektoren leer sind. Für jeden Vektor müssen Sie vor dem Zugriff auf seine Elemente die Größe auf die gewünschte Größe ändern. Hier ist der korrekte Code:

struct Feedback 
{ 
    int startX; 
    int startY; 
    int endX; 
    int endY; 
    int suppress; 
}; 

vector<Feedback> Tripfeed[288]; 

for(time = 0; time < 288; time++) 
{ 

    Tripfeed[time].resize (tripList.size()); 

    for (int trp=0; trp < tripList.size(); trp++) 
    { 
     Tripfeed[time][trp].startX = tripList[trp].startX; 
     Tripfeed[time][trp].startY = tripList[trp].startY; 
     Tripfeed[time][trp].endX = tripList[trp].endX; 
     Tripfeed[time][trp].endY = tripList[trp].endY; 
     Tripfeed[time][trp].suppress = tripList[trp].suppress; 
    } 
} 
+0

Danke eine Million! Normalerweise bevorzuge ich push_back, damit ich die Größe nicht ändern muss, aber das hätte ich gemerkt. – Far

+0

Wenn Sie die Größe des Vektors im Voraus kennen, erhalten Sie eine viel bessere Leistung, weil es nur eine Speicherzuweisung gibt. Wenn Sie 1000 Elemente einzeln gedrückt haben, wächst der Vektor nach Bedarf weiter. Jedes Mal, wenn es wächst, muss es einen größeren Speicherblock zuweisen, den alten Speicher in den neuen Speicher kopieren und dann den alten Speicher löschen. –

0

Ihre Erklärung Tripfeed sollte

vector<vector<Feedback>> Tripfeed(288, vector<Feedback>(tripList.size(), Feedback())); 
0

sein, wenn Sie einen anständigen Compiler mit Bereich haben auf Basis for-Schleife zur Verfügung:

#include <algorithm> 

// ... 

for (std::vector<Feedback>& f : Tripfeed) 
{ 
    f.resize(tripList.size()); // all vectors in Tripfeed are initially empty 
    std::copy(tripList.begin(), tripList.end(), f.begin()); 
} 
0

Verwenden Sie resize(), um dem Vektor genügend Speicher zuzuordnen. Ihr Code sollte etwas wie unten sein. Ich empfehle jedoch, 2D-Vektoren zu verwenden, um Tripfeed zu deklarieren (std :: vector < std :: vector < Feedback>> Tripfeed).

for(int time = 0; time < 288; time++){ 
    Tripfeed[time].resize(tripList.size()); 
    for (int trp=0; trp < tripList.size(); trp++) { 
     Tripfeed[time][trp].startX = tripList[trp].startX; 
     Tripfeed[time][trp].startY = tripList[trp].startY; 
     Tripfeed[time][trp].endX = tripList[trp].endX; 
     Tripfeed[time][trp].endY = tripList[trp].endY; 
     Tripfeed[time][trp].suppress = tripList[trp].suppress; 
    } 
    } 
+0

Danke! Das war eine dumme Unterlassung meinerseits. – Far