2017-03-11 8 views
1

Leider kann ich den vollständigen Code nicht einfügen, aber ich werde mein Bestes versuchen, um das Problem zu erklären. Ich habe einen Vektor der Struktur. Ich übergebe den Vektor an eine Funktion, die den Vektor mit Struktur füllt und den Vektor zurückgibt. Aber wenn ich versuche, auf die Vektorelemente zuzugreifen, bekomme ich nur das letzte Element eingefügt. Ich denke, dass das Problem irgendwo ist, dass ich die Adresse der Struktur speichere, und deshalb behält Vektor nur den letzten Wert bei, aber ich bin nicht sicher, wie man das korrigiert.Vektor der Struktur gibt nur den letzten Wert zurück

Hier meine Struktur ist:

struct NA 
{ element1; 
    element2; 
}; 

Hier ist, wie ich meine Vektor übergeben, nachdem sie erklärt:

Vector<NA> del; 
func(del); 

Hier ist meine Funktion ist: (q ist eine Variable ergibt sich aus einer gespeicherten Prozedur mit

func(Vector<NA> &dels) 
{ 
    NA& del(*new NA); 
    while(q.nextquery()) 
    { 
    while(q.nextrow()) 
    { 
     q.bind(del.element1); 
     q.bind(del.element2); 
     dels.insert(&del); 
    } 
    return dels.entries() 
} 
+0

verfassen [MCVE] nach Bedarf bitte. –

+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Es gibt einige Beschränkungen in meiner Firma, für die ich Werkzeuge wie intellij und eclipse nicht verwenden kann. Wenn dies Java wäre, hätte ich definitiv meinen Code debugged, aber hier ist es schwierig, würde eine Lösung erwarten, wenn möglich :) – user3274263

Antwort

0
NA& del(*new NA); 
while(q.nextquery()) 
    dels.insert(&del); 

Offensichtlich erstellen Sie nur ein Objekt del, aber Sie fügen es mehrmals in demselben Vektor ein. Am Ende zeigen alle Einträge des Vektors auf das gleiche Objekt.

Was Sie wollen, ist wahrscheinlich ein neues del Objekt für jeden Eintrag in Ihrem Vektor zu erstellen. Setzen Sie daher die creation-Anweisung in die Schleife.

func(Vector<NA> &dels) 
{ 
    while(q.nextquery()) 
    { 
    while(q.nextrow()) 
    { 
     NA& del(*new NA); // <-- Here 
     q.bind(del.element1); 
     q.bind(del.element2); 
     dels.insert(&del); 
    } 
    return dels.entries() 
} 
+0

ok lass mich das einmal versuchen, dachte ich mir das aber wird dies viel Platz verbrauchen und viele Strukturzeiger erstellen ? – user3274263

+0

@ user3274263 Wenn dies das ist, was Sie wollen, müssen Sie. Ich kann nicht sagen, es gibt Workarounds, um etwas Speicher zu sparen, weil ich nicht genug über Ihren gesamten Code weiß. Das sollte dein aktuelles Problem vorerst beheben :) –

0

func() wird, um mehrere Kopien eines einzelnen Zeigers auf ein einziges dynamisch zugewiesenen Objekt in den Vektor schieben. Jede Schleifeniteration ändert dasselbe Objekt, sodass jeder Eintrag im Vektor auf die Daten des letzten gelesenen Abfragedatensatzes zeigt.

Probieren Sie etwas Ähnliches statt:

func(Vector<NA> &dels) { 
    while(q.nextquery()) { 
     while(q.nextrow()) { 
      NA *del = new NA; 
      q.bind(del->element1); 
      q.bind(del->element2); 
      dels.insert(del); 
     } 
    } 
    return dels.entries(); 
} 

Auf der anderen Seite, warum Sie Zeiger im Vektor sind Speichern? Und mit einer nicht standardmäßigen Vektorklasse? Es wäre sicherer, tatsächliche Objekte in eine Standard-std::vector Klasse zu speichern statt:

void func(std::vector<NA> &dels) { 
    while(q.nextquery()) { 
     while(q.nextrow()) { 
      NA del; 
      q.bind(del.element1); 
      q.bind(del.element2); 
      dels.push_back(del); 
     } 
    } 
} 
Verwandte Themen