2016-09-15 5 views
1

Ich versuche gerade, "variadic functions" herunterzufahren und versuche gerade, 4 Namen in einem String-Vektor zu laden und dann auszudrucken. Wenn ich das mit 'int' tue und Zahlen benutze, funktioniert es gut, aber wenn ich einen String-Vektor verwende, bekomme ich den Fehler.Fehler "Vektor-Index außerhalb des Bereichs"

#include "stdafx.h" 
#include<cstdio> 
#include<cstdarg> 
#include<string> 
#include<vector> 
#include<iostream> 
using namespace std; 



int count; 

vector<string> namesVector; 

void names(int count, ...) 
{ 
    va_list namesList; 

    int i; // for loop 

    va_start(namesList, count); 

    for (i = 0; i < count; i++) 
    { 
     string currentElement; 
     currentElement = va_arg(namesList, string); 

     namesVector[i] = currentElement; 

    } 

    va_end(namesList); 
} 


int main() 
{ 
    int nameCount = 4; 

    names(nameCount,"jon", "maggie", "joan", "alfred"); 

    for (int i = 0; i < nameCount; i++) 
    { 
     cout << "Name at element " << i << " is: " << namesVector[i] << endl; 
    } 

} 
+1

Es klingt wie Sie lernen müssen, können, wie ein Debugger zu verwenden, durch den Code zu treten. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: ** [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** –

+0

Ich schlage vor, Sie verbringen einige Zeit [lesen wie »std :: vector« funktioniert (http://en.cppreference.com/w/cpp/container/vector). – caps

Antwort

3

In C++ können nur trivial kopierbare Typen als variadische Argumente verwendet werden. Da std::string von einem Zeiger char* konstruierbar ist, der auf einen nullterminierten Puffer zeigt, können Sie char* statt std::string Typ verwenden. Ersetzen Sie einfach

currentElement = va_arg(namesList, string); 

mit

currentElement = va_arg(namesList, char*); 

in Ihrem Code. Um diese Einschränkung zu umgehen, betrachten Sie variadic templates, die Code für jeden von Ihnen verwendeten Typ in der Kompilierungszeit generieren.

Ihr Code enthält auch einen Laufzeitfehler. Dies:

namesVector[i] = currentElement; 

ist sehr wahrscheinlich, dass Ihr Programm zum Absturz zu bringen, wie Sie keinen Speicher in dem Vektor zugewiesen haben. Vektoren sind eigentlich dynamische Arrays, daher sollten Sie entweder ein Größenargument an den entsprechenden Konstruktor übergeben oder resize auf dem Vektor aufrufen. In Ihrem Fall können Sie weder davon, aber nur push_back method verwenden:

namesVector.push_back(currentElement); 
+0

Vielen Dank! Das hat es behoben und danke für die Erklärung! – JSan782

Verwandte Themen