Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

std::string erase usuwa ostatni znak tylko raz

Ostatnio zmodyfikowano 2013-06-26 14:36
Autor Wiadomość
RazzorFlame
Temat założony przez niniejszego użytkownika
std::string erase usuwa ostatni znak tylko raz
» 2013-06-26 13:12:36
Pisze gre i zatrzymałem się na tym:
C/C++
else if( win->m_Event.Type == sf::Event::KeyPressed && win->m_Event.Key.Code == sf::Key::Back )
{
    if( m_Text.size() > 0 )
    {
        m_Text.erase( m_Text.length() - 1, 1 );
    }
}
Ten kawałek kodu usuwa tylko jeden raz znak z końca... Nie wiem dlaczego. Próbowałem też
m_Text.erase( m_Text.size() - 1, 1 );
Dodam że oczywiście w funkcja w której jest ten kod jest zagnieżdżona w pętli eventów.
P-86198
pekfos
» 2013-06-26 13:41:14
A ile ma usuwać?
C/C++
string & erase( size_t pos = 0, size_t len = npos );
Erases the portion of the string value that begins at the character position pos and spans len characters
http://www.cplusplus.com/reference/string/string/erase/
Równie dobrze można tu użyć string::pop_back().
P-86201
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-06-26 13:48:49
Nie zrozumiałeś o co mi chodzi. Nie mówie że tylko 1 znak, ale tylko 1 raz. Chociaż powinno usuwać za każdym razem kiedy wciskam Backspace. Ma usuwać 1 znak za każdym razem kiedy wcisne Backspace, a tu usuwa tylko 1 raz. Nawet jeśli wciskam backspace więcej razy.
P-86203
xevuel
» 2013-06-26 13:51:23
Pierwsze co powinieneś zrobić to upewnić się że warunki są poprawne i że na pewno wykonuje się ona więcej razy. Zrobiłeś to?
P-86204
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-06-26 13:55:47
@UP, tak wykonuje się tylko nie usuwa znaku.
Równie dobrze można tu użyć string::pop_back().
Gdyby to było takie łatwe... Próbowałem z tym ale to jest dodane w cpp11. Nawet ściągnąłem nową wersje MinGW i dodałem do cmdline odpowiednie komendy... Już niby wszystko było OK ale nagle błędy linkera że nie znaleziono -lsfml-graphics-s i innych bibliotek z SFML. To wtedy podlinkowałem je z ścieżki a wtedy piękne "undefined reference to" chyba z 500x i co ciekawe nawet do funkcji z mojego projektu. NP:
C/C++
class Vector2D
{
    int X, Y;
    //...
    Vector2D( int, int );
};
I błędzik: "undefined reference to 'Vector2D::Vector2D(int,int)'". A ofc na starszym MinGW (4.6.2) działa perfekcyjnie.
P-86206
pekfos
» 2013-06-26 14:03:53
SFML musi być skompilowany pod nowym GCC, projekt trzeba przebudować, itd.. Takie rzeczy, których zapewne nie zrobiłeś i teraz sypią się błędy ;)

Ale wracając do tematu: na 99% problem nie jest z kodem, który podałeś. Już samo else na początku może o tym świadczyć. Poprzedni warunek się spełni i już nie działa..
P-86207
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-06-26 14:07:25
Myślisz że ja głupi jestem? Wiem o tym ale jak napisałem wcześniej dochodzi do linii z erase tylko coś szwankuje i się już za > 1 razem nie usuwa znak. BTW poprzedni warunek sprawdza czy został wciśnięty enter... Cały kod funkcji:
C/C++
std::string GUI_EditBox::checkTextEntered( GameWindow * win )
{
    if( m_Active )
    {
        if( win->m_Event.Type == sf::Event::TextEntered )
        {
            m_Text += win->m_Event.Text.Unicode;
        }
        else if( win->m_Event.Type == sf::Event::KeyPressed && win->m_Event.Key.Code == sf::Key::Return )
        {
            std::string txtCopy = m_Text;
            m_Text = "";
            return txtCopy;
        }
        else if( win->m_Event.Type == sf::Event::KeyPressed && win->m_Event.Key.Code == sf::Key::Back )
        {
            if( m_Text.size() > 0 )
            {
                m_Text.erase( m_Text.length() - 1, 1 );
            }
        }
    }
   
    return "";
}
P-86208
DejaVu
» 2013-06-26 14:24:53
Równie dobrze możesz dodawać i usuwać jeden znak przez co masz wrażenie, że nic się nie dzieje. Wypisz tekst przed usunięciem i po usunięciu. Tak jak pisali Ci poprzednicy: problem nie leży w wywołaniu metody na którą się powołujesz tylko w liczbie wywołań tej metody, a ta z kolei jest zależna od spełnienia wcześniejszych warunków.

PS. Backspace też jest znakiem, który jest pisany, więc jeżeli nie masz if-a wykluczającego ten znak to zostanie on dodany do tekstu jako kod ascii 8 (backspace chyba miał kod ascii 8... może 9).
P-86211
« 1 » 2
  Strona 1 z 2 Następna strona