Objekte in Vector schreiben und gleichzeitig löschen



  • Hallo mal wieder, ich bastel mir gerade eine Klasse für einfache Partikeleffekte.

    Jetzt habe ich ein kleines Problem, per Mausklick werden Elemente in eine vector<struct> gepackt, via for-Schleife wird die LifeTime von jeden Partikel überprüft und wenn diese vorbei ist mit vector.erase(vector.begin()+i) gelöscht.

    Leider passiert diese Überprüfung immer erst wenn ich die Maustaste wieder losgelassen habe, bzw keine neuen Partikel hinzugefügt werden.

    http://img442.imageshack.us/img442/2619/unbenanntdpf.png



  • Dann musst du die Überprüfung eben nicht erst beim Loslassen durchführen. Im Ernst, was für Antworten erwartest du mit so einer Problembeschreibung?

    Im Übrigen habe ich schon im anderen Thread gesagt, dass du nicht mit std::vector::erase() während der Iteration löschen sollst. Liest du Antworten auch?



  • Die Überprüfung passiert in einer separaten Memberfunktion, und ja, ich lese die Antworten, das mit vector.erase() hab ich leider übersehen 🙄



  • Ich meinte damit: Sollen wir raten, wo das Problem liegt? Du hast ja nicht mal eine Frage gestellt. Was nun die separate Memberfunktion mit dem Problem zu tun hat, ist ein weiteres Rätsel.

    Lies bitte diesen Post, besonders Punkt 6.



  • Entschuldigung, ich werde mehr Acht geben.

    Also....,

    wie kann ich gleichzeitig Elemente in einen Vector hinzufügen und gleichzeitig beliebige Elemente während des push_back löschen. Gibt es eine andere Variante als mit remove_if?


  • Mod

    Was meinst du mit gleichzeitig? Siehe Nexus Anmerkung zu präzisen Fragen. vector ist in der Regel nicht threadsicher, außer du verwendest spezielle threadsichere Varianten. Meinst du das mit gleichzeitig?
    Was hat remove_if mit irgendetwas davon zu tun?
    Wie hängt das alles mit Mausklicks zusammen?
    Was ist überhaupt dein Problem?

    Wenn du Fragen anstatt Antworten auf deine Fragen erhältst, dann stimmt etwas nicht mit deinen Fragen.



  • grimmreefer schrieb:

    wie kann ich gleichzeitig Elemente in einen Vector hinzufügen und gleichzeitig beliebige Elemente während des push_back löschen.

    Was passt euch an der Fragestellung nicht?

    SeppJ schrieb:

    Was meinst du mit gleichzeitig?

    Ich meine während des push_backs.

    SeppJ schrieb:

    Was hat remove_if mit irgendetwas davon zu tun?

    Nexus schrieb:

    Ich würde eher std::remove_if() verwenden.

    SeppJ schrieb:

    Wie hängt das alles mit Mausklicks zusammen?

    grimmreefer schrieb:

    per Mausklick werden Elemente in eine vector<struct> gepackt

    SeppJ schrieb:

    Was ist überhaupt dein Problem?

    grimmreefer schrieb:

    Leider passiert diese Überprüfung immer erst wenn ich die Maustaste wieder losgelassen habe, bzw keine neuen Partikel hinzugefügt werden.

    Ich versteh nicht was euch nicht passt.



  • grimmreefer schrieb:

    SeppJ schrieb:

    Was meinst du mit gleichzeitig?

    Ich meine während des push_backs.

    push_back fügt ein Element in den vector ein. Da passiert nichts "gleichzeitig".

    Meinst du vielleicht "unmittelbar danach"?



  • grimmreefer schrieb:

    Ich versteh nicht was euch nicht passt.

    Es fehlen die Zusammenhänge. Du hast lauter Bruchstücke an Informationen. Selbst durch Raten ist es noch sehr schwer, diese zusammenzusetzen und sich dein Problem vorzustellen.

    Auf jede Frage, die wir stellen, kommt eine Antwort, nach der man kaum mehr weiss als vorher. "Was hat das mit Mausklicks zu tun" - "Mit Mausklicks werden Elemente eingefügt" - UND? Was ist denn das Problem, die Einfügung oder der Mausklick? Blende irrelevante Information aus und fokussiere dich auf das Wichtige.

    Im Übrigen ist es nicht gerade die feine Art, den gleichen Thread im SFML-Forum zu erstellen und dort ebenso schlecht zu beschreiben. Verwende die Zeit lieber um deine Problembeschreibung hier zu überarbeiten, dadurch kriegst du bessere Antworten. Dass du meinen Hinweis auf die reservierten Bezeichner im anderen Thread ebenfalls überlesen hast, steigert meine Motivation zu helfen übrigens auch nicht gerade.

    Also streng dich bitte ein wenig an, wir wollen dir nicht jedes Stück Information aus der Nase ziehen. Versetze dich in die Lage von Leuten, die dein Programm nicht kennen und aus deiner Beschreibung schlau werden müssen.



  • Nexus schrieb:

    Im Übrigen ist es nicht gerade die feine Art, den gleichen Thread im SFML-Forum zu erstellen

    Nichts für ungut, aber wenn ich in 10 verschiedenen Foren reinschreibe bleibst es immer noch meine Sache. Das soll keine Provokation sein.

    grimmreefer schrieb:

    per Mausklick werden Elemente in eine vector<struct> gepackt, via for-Schleife wird die LifeTime von jeden Partikel überprüft und wenn diese vorbei ist mit vector.erase(vector.begin()+i) gelöscht.

    Leider passiert diese Überprüfung immer erst wenn ich die Maustaste wieder losgelassen habe, bzw keine neuen Partikel hinzugefügt werden.

    Ich verstehe nicht was dabei unklar ist. Ich drücke die linke Maustaste. Über eine Memberfunktion werden Elemente mit push_back in einen vector<struckt> gepackt.

    WÄHRENDDESSEN wird im selben Moment in einer anderem Memberfunktion überprüft ob ein Element noch gültig ist. Wenn nicht wird es gelöscht.

    Das erfolgt aber nur wenn ich die Maustaste nicht drücke und damit Elemente hinzufüge.

    Falls ihr mir jetzt Folgen könnt, wie kann ich das lösen, so das während ich hinzufüge auch gelöscht wird?



  • Ich verstehe nicht was dabei unklar ist. Ich drücke die linke Maustaste. Über eine Memberfunktion werden Elemente mit push_back in einen vector<struckt> gepackt.

    Die linke Maustaste ist hier erstmal irrelevant, Du sagst ja nicht, wie die damit zusammenhängt (technisch... Du sagst, dass das beim Klick passiert, aber gibst keine Implementierungsdetails -> vollkommen unmöglich darauf basierend Hilfestellung zu geben). Aber okay, Du hast offensichtlich einen EventHandler dafür (auch erstmal egal), in dem mehrere Elemente in einen vector eingefügt werden. Gut, mag ja so sein.

    WÄHRENDDESSEN wird im selben Moment in einer anderem Memberfunktion überprüft ob ein Element noch gültig ist. Wenn nicht wird es gelöscht.

    Du unterliegst dem Irrtum, dass es so etwas wie Gleichzeitigkeit gibt. Das gibt es auf einem Computer nie wirklich.

    Sag doch Mal, wieso Du das gleichzeitig haben willst. Meinst Du, während der push_back-Iteration, in der etwas eingefügt wird? Meinst Du mit "währenddessen" zeitlich parallel, also wirklich mit Threads?

    push_back dient zum Einfügen, mehr kann das nicht. Du kannst also nicht gleichzeitig etwas löschen. Du könntest etwas ändern (dafür wäre eine andere Methode notwendig). Oder Du kannst danach löschen. Mit einem push_back-Methodenaufruf wirst Du kein Löschen erreichen können.

    Das erfolgt aber nur wenn ich die Maustaste nicht drücke und damit Elemente hinzufüge.

    Es gibt tausend Möglichkeiten Maustasten-Drücke zu behandeln, das ist je nach Bibliothek eine ganz andere Sache. Und je nachdem, wie Du das gerade behandelst. Wenn Du denkst, aus Deiner Aussage kann man etwas Sinnvolles ziehen, um Dir zu helfen, dann musst Du bei jedem hier Kristallkugeln voraussetzen.

    Falls ihr mir jetzt Folgen könnt, wie kann ich das lösen, so das während ich hinzufüge auch gelöscht wird?

    Definiere währenddessen. Du hast etwas dazu im Kopf, was nicht allgemeingültig ist. Wir wiederum können aber nicht in Deinen Kopf schauen und sehen, was Du damit meinst (oder tun es nicht, weil das Fähigkeiten preisgeben würde, die zu verbergen sind, um nicht diverse Untergrund-Organisationen dazu zu bringen uns zu kidnappen oder zu erpressen, um eben diese telepathischen Fähigkeiten auszunutzen). Das Wort währenddessen alleine ist einfach zu wenig.


  • Mod

    Dir wurde schon vor Ewigkeiten eine Antwort gegeben:

    SeppJ schrieb:

    Was meinst du mit gleichzeitig? [...] vector ist in der Regel nicht threadsicher, außer du verwendest spezielle threadsichere Varianten. Meinst du das mit gleichzeitig?

    Da du niemals darauf eingegangen bist und bloß patzig wurdest bei Gegenfragen, wie sollen wir dann wissen, ob es diese Antwort ist, die du suchtest?



  • SeppJ schrieb:

    Dir wurde schon vor Ewigkeiten eine Antwort gegeben:

    SeppJ schrieb:

    Was meinst du mit gleichzeitig? [...] vector ist in der Regel nicht threadsicher, außer du verwendest spezielle threadsichere Varianten. Meinst du das mit gleichzeitig?

    Da du niemals darauf eingegangen bist und bloß patzig wurdest bei Gegenfragen, wie sollen wir dann wissen, ob es diese Antwort ist, die du suchtest?

    Ich mach mir hier echt Freunde.

    Und ich wurde nicht patzig, ich verzweifle nur an mir selbst. Was hat hat es mit dieser threadsichere Varianten auf sich?



  • WAS meinst Du mit gleichzeitig. Antworte Mal, bevor Du Gegenfragen stellst. Denn das Ignorieren der Fragen, das macht dich echt antipathisch... Und wenn Du wichtige Gegenfragen ignorierst, dann kann Dir keiner helfen, wird Dir keiner helfen und - ganz ehrlich - dann will Dir auch keiner helfen.

    Also beantworte doch bitte einfach ALLES, was Dich gefragt wird.



  • Eisflamme schrieb:

    WAS meinst Du mit gleichzeitig.

    Im gleichen Moment in dem ich den push_back mache.



  • Zeig verdammt nochmal Code.
    Und im gleichen Moment, in dem du push_back() machst geht nicht, außer du arbeitest mit Threads (was ich bezweilfe).



  • Erzeugen:

    void PARTICLE::_ADDPARTICLE(string type, float LIFETIME, float SPEED, float GRAVITY, string TEXTURENAME, sf::Vector2f POSITION, unsigned int AMOUNT, unsigned int DIRECTION)
    {
    
        unsigned int counter = AMOUNT;
    
        _Timer.restart();
    
        _Texture.loadFromFile(TEXTURENAME);
        _Texture.setSmooth(true);
    
        sf::Sprite      _Sprite;
        _Sprite.setTexture(_Texture);
    
        _Data._Type = type;
        _Data._LifeTime = LIFETIME;
        _Data._Position = POSITION;
        _Data._Sprite = _Sprite;
        _Data._Sprite.setPosition(POSITION);
        _Data._Speed = SPEED;
        _Data._Gravity    = GRAVITY;
        _Data._Alpha = 255;
        _Data._Sprite.setOrigin(_Texture.getSize().x/2.f, _Texture.getSize().y/2.f);
    
    if(_Data._Type == "SPARK")
    {
        for(unsigned int i = 0; i < counter; i++)
        {
            unsigned int _Direction = rand()%360;
            _Data._Direction = _Direction;
            _Data._Sprite.setRotation(_Direction);
    
            _AllParticle.insert(_AllParticle.begin(),_Data);
        }
    }
    
    if(_Data._Type == "JET")
    {
        for(unsigned int i = 0; i < counter; i++)
        {
            _Data._Direction = DIRECTION;
    
            _AllParticle.insert(_AllParticle.begin(),_Data);
        }
    }
    
    }
    

    Prüfe, löschen:

    void PARTICLE::_CheckLifeTime()
    {
    
            for(unsigned int i = 0; i < _AllParticle.size(); i++)
        {
                if(_AllParticle[i]._LifeTime <= 0 )
                {
                    _AllParticle.erase(_AllParticle.begin()+i);
                }
        }
    }
    


  • Beim push_back löschen: Ja, das geht nicht, überhaupt nicht.

    Das ist aber auch nicht nötig. Du hast ja ein Problem, was Du lösen willst, wofür Du denkst, dass die Lösung sei eine Gleichzeitigkeit einzubauen. Aber das ist die Sache: Diese von Dir erdachte Lösung ist gar keine gute Lösung.

    D.h. Du solltest beschreiben, wofür Du diese Gleichzeitigkeit brauchst oder: Welches Problem willst Du mit der Gleichzeitigkeit von push_back + Löschen lösen? (das hast Du uns nicht verraten oder es wurde nicht ersichtlich)


  • Mod

    da ist keinerlei Gleichzeitigkeit. Auch keine Abfolge. Weil nirgendwo irgendetwas aufgerufen wird. Du hast uns bloß ein paar Funktionen gezeigt (übrigens mit jeder Menge ungültiger Bezeichner). Keinerlei Zusammenhang zwischen diesen Funktionen.

    Ich geb es auf. Ich moderier diesen Thread bloß noch, aber ich werde nicht mehr mitlesen oder helfen.



  • SeppJ schrieb:

    Keinerlei Zusammenhang zwischen diesen Funktionen.

    Ok, Jetzt werde ich Patzig, wieso gibt es da keinen Zusammenhang??? Erklär mir was du damit meinst! Das sind beides Methoden einer Klasse die in der main aufgerufen werden. Was bitte ist da unklar?

    Ich drücke die Maus:

    if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
        {
            sf::Vector2f temp;
            temp.x = window.mapPixelToCoords(sf::Mouse::getPosition(window)).x;
            temp.y = window.mapPixelToCoords(sf::Mouse::getPosition(window)).y;
    
            _PAR._ADDPARTICLE("SPARK", 10, 20, 0, "Images/SPARK.png", temp, 20, 0);
        }
    

    Partike werden hinzugefügt mit:

    if(_Data._Type == "SPARK")
    {
        for(unsigned int i = 0; i < counter; i++)
        {
            unsigned int _Direction = rand()%360;
            _Data._Direction = _Direction;
            _Data._Sprite.setRotation(_Direction);
    
            _AllParticle.push_back(_AllParticle.begin(),_Data);
        }
    }
    

    Während ich Partikel hinzufüge prüfe ich mit

    void PARTICLE::_CheckLifeTime()
    {
    
            for(unsigned int i = 0; i < _AllParticle.size(); i++)
        {
                if(_AllParticle[i]._LifeTime <= 0 )
                {
                    _AllParticle.erase(_AllParticle.begin()+i);
                }
        }
    }
    

    ..ob irgendwo im vector ein element ist welches "Tot" ist und löscht es. Das geschieht aber nur wenn ich keine Elemente hinzufüge. Erst danach, also wenn ich meine maus nicht mehr drücke.


Log in to reply