Variabler Vektorname?



  • Hi,

    ich habe mehrere Vektoren, in denen Daten gespeichert werden sollen. Diese können auch über eine Variable auf "nicht schreibbar" gesetzt werden.
    Nun möchte ich der Funktion irgendwie beibringen, dass, wenn Vektor 1 besetzt ist, sie Vektor 2 ausprobieren soll, und den dann als Schreibevektor nimmt. Gibt es so eine Möglichkeit? Ich suche also so etwas in der Art, wie:

    Vektorname = "Vektor1"
    if (Vektorname.write==false) Vektorname="Vektor2"
    ...
    Vektorname.push_back(...)

    Ich hoffe, Ihr könnt mir helfen, MfG, Ozzy



  • Über Namen kannst du zur Laufzeit nicht mehr gehen, die werden vom Compiler verschluckt (von einer Variable hast du am Ende nur noch ihren Speicherblock, dessen Adresse das Programm sich gemerkt hat). Aber du könntest Pointer verwenden:

    Vector* pvec = &Vector1;
    if(pvec->write == false) pvec= &Vector2;
    
    pvec->push_back(...);
    


  • Jo, vielen Dank, dann werde ich das mal ausprobieren!!!

    MfG, und vielen Dank noch einmal für die schnelle Antwort, Ozzy



  • Hi,

    noch einmal eine Frage: gibt es so etwas wie Dein pvec->write wirklich? Oder hast Du das nur so bei mir abgeschrieben? Das ist nämlich gerade mein nächstes Problem. Eigentlich bäuchte ich so etwas wie:

    i=1
    if (("Vektor"+i)_write==false) i++
    ...

    Also, das die Zahl dahinter auch noch erhöht wird.

    Kannst Du mir dabei auch helfen? MfG, Ozzy



  • Wenn du von der STL-Klasse 'std::vector' sprichst - die hat keine derartige Kennung. (ja, die Bedingung habe ich direkt aus deinem Code übernommen)

    In dem Fall könntest du alle in Frage kommenden Vectoren in einem Array (oder vector) speichern und jeweils mit einer derartigen Kennung versehen:

    pair<vector<int>,bool> Vectors[count];
    //oder:
    //vector<pair<vector<int>,bool> > Vectors;
    int i=0;
    while (Vectors[i].second==false) ++i;
    
    Vectors[i].first.push_back(...);
    


  • Hi,

    also auch mit dem Vektor klappt das nicht so ganz.
    Wenn ich Vector so wie Du groß schreibe, dann sagt er:
    Vector wurde in diesem Gültigkeitsbereich nicht definiert.
    wenn ich es aber klein schreibe, dann sagt er:
    missing template arguments before »*« token

    Kannst Du mir damit noch einmal weiterhelfen?

    MfG, Ozzy



  • Ozzy schrieb:

    Hi,

    also auch mit dem Vektor klappt das nicht so ganz.
    Wenn ich Vector so wie Du groß schreibe, dann sagt er:
    Vector wurde in diesem Gültigkeitsbereich nicht definiert.
    wenn ich es aber klein schreibe, dann sagt er:
    missing template arguments before »*« token

    An der Stelle hatte mich wohl dein "Vectorname.write==false" verwirrt. std::vector hat kein Element 'write', deshalb habe ich eine eigene Vector-Klasse vermutet. Wenn du wirklich std::vector verwenden willst, mußt du natürlich auch die richtige Template-Spezialisierung vector<...>* angeben.



  • Aso, sorry, dann hatte ich mich nicht richtig ausgedrückt...

    Also ich habe ich einer Klasse die Vektoren als extern stehen, da mehrere Klassen auf die zugreifen sollen.
    Und in einer Klasse soll eben in den Vektor geschrieben werden.

    Muss ich dann dieses Pointer schon in die Klasse reinschreiben, wo die Vektoren stehen, oder erst da, wo ich z.B. pushen will?

    MfG, Ozzy



  • Den Pointer kannst du theoretisch dort anlegen, wo du mit deinen Vektoren arbeiten willst. Aber eventuell weiß der Besitzer besser als du, welcher seiner Vektoren gerade "gültig" ist - dann sollte er sich um die Auswahl kümmern (indem er eine Methode get_active_vec() bereitstellt, die einen Pointer/Referenz auf einen der Vektoren zurückgibt).

    PS: Nur mal zur Orientierung - was hast du mit dem Design vor?



  • Hi,

    also es geht bei der Geschichte um einen Systementwurf, und der soll eben vom Aufbau her relativ "richtig" sein. Der Vektor ist momentan für den Speicher da, und die anderen Klassen (Komponenten) können eben in den Speicher schreiben, oder lesen. Wird der Speicherinhalt aber gerade bearbeitet (in dem Fall wird auch das Schreiben verhindert), muss sich der Schreibende eben einen neuen Speicher wählen...

    MfG, Ozzy



  • @CStoll: Hi,

    kannst Du mir vielleicht das mit dem pair erklären? (ich möchte das Ding auch noch für andere Klassen zugänglich machen, daher das extern.

    Also ich habe jetzt dieses pair definiert:

    extern vector<pair<vector<int>,bool> > Vectors;
    

    und das Ding in der cc Datei definiert.

    Wenn ich das nun aber probiere, ein Teil da rauszulesen:

    cout << Vectors[0].first.back();
    

    Sagt er mir: "no match für >>operator[]<< in Vectors[0]<<

    Hast Du da vielleicht eine Idee, was das sein könnte?

    MfG, Ozzy



  • Ein 'pair' ist - direkt übersetzt - ein Paar, also die Zusammenfassung von zwei beliebigen Objekten zu einem. In der STL-Klasse std::pair kommst du über die Member first und second an die beiden Teile.

    Deine Variable 'Vectors' ist ein kompletter vector mit diesen Paaren (jeweils aus einem int-vector und einem Boolean), also sollte er eigentlich auch einen operator[] definiert haben. Zeig doch mal bitte etwas mehr als nur ein paar Code-Schnipselchen.

    (ich hab' die Konstellation mal im Schnelltest durch den Compiler gejagt - das klappte ohne Probleme)


Anmelden zum Antworten