2017-07-23 27 views
0

Also mache ich eine Funktion, um certatin Elemente eines Vektors zu nehmen und sie in einem anderen Vektor zu speichern. Wann immer ich das Programm starte, gibt es einen Segmentierungsfehlerfehler? Warum passiert das und wie kann ich Dinge reparieren, damit das nicht passiert?Vektoren, die an die Funktion übergeben werden, werden nicht geändert

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

void addition (vector <char> a, vector <string> b) 
{ 
    for (int i = 0; i < a.size(); ++i) 
    { 
    if (a[i] == '3') 
    { 
     b.push_back("3"); 
    } 
    if (a[i] == '4') 
    { 
     b.push_back("4"); 
    } 
    if (a[i] == '+') 
    { 
     b.push_back("+"); 
    } 
    } 
} 

int main() 
{ 
    vector <char> v1 = {'3', '4', '+', '3', '4'}; 
    vector <string> v2; 

    addition(v1, v2); 
    cout << v2[0] << endl; 

    return 0; 
} 
+0

Warum passieren? Ich bin verwirrt – bastwendo

+0

Ich sah nicht genau genug, mein Fehler. Nahm es zurück – CIsForCookies

+0

Der Fluss des Programms wird viel klarer, wenn Sie Out-Parameter vermeiden. Z.B. '' 'Vektor Addition (Vektor a)' ''. Es gibt viele andere gute Gründe, sie zu vermeiden. – tillaert

Antwort

4

Sie übergeben eine Kopie der Vektoren und keine Referenz.
Wechsel:

void addition (vector <char> a, vector <string> b) 

in:

void addition (const vector <char> &a, vector <string> &b) 

Hinweis: änderte es a auf eine Referenz zu nur unnötigen Kopien zu speichern, und machte es konst sicherzustellen, dass es nicht geändert wird.

5

Der Parameter b als Pass-by-Wert deklariert wird, ist es so nur eine Kopie des Arguments und jede Änderung auf sie innerhalb addition() hat nichts mit dem ursprünglichen Argumente zu tun gebenen in (d v2 in main()). Dann cout << v2[0] << endl; führt zu undefined behavior (bedeutet alles ist möglich), weil v2 noch leer ist.

Sie sollten es zu Pass-by-Referenz ändern, z.

void addition (vector <char> a, vector <string>& b) 
//            ~ 

BTW: a sollte auch als Pass-by-reference deklariert werden, unnötige Kopie zu vermeiden, haben

void addition (const vector <char>& a, vector <string>& b) 
1

.e.g Sie v2 eine neue Kopie des Vektors übergeben. Die in der Funktion vorgenommenen Änderungen an v2 werden also tatsächlich an die Kopie vorgenommen, nicht an v2.
Als Ergebnis bleibt v2 tatsächlich leer, und Zugriff auf v2[0] gibt Segmentierungsfehler.

Lösung ist anhand von v2 als

void addition (vector <char> a, vector <string> &b)

Verwandte Themen