Komischer Fehler, cout verändert Algorithmus



  • Hallo,
    bei Folgendem weiss ich wirklich nicht, wo das Problem ist... Wenn man die Stelle mit "#########" markiert auskommentiert, bekommt man die richtige Ausgabe

    [AAA]
    AAB
    AAC

    Wenn man die Zeile aber einkommentiert, bekommt man die Ausgabe

    [AAA]
    A
    B
    AAB
    AAA
    C
    AAC
    AAA

    Die einzelnen Buchstaben A,B,C kommen da von der Zeile "cout << c << endl ;", aber die "AAA" sollten doch eigentlich nicht mit ausgegeben werden, ich habe ja nur diese eine Zeile verändert. Dasselbe passiert, wenn ich ganz am Anfang ein "vector<int>" deklariere.

    Weiss da jemand weiter, woran das liegen könnte?

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std ;
    
    // zählt, wieviele gleiche Zeichen str an seinem rechten Ende hat
    size_t anzGleicheZeichenAmEnde( string const& str )
    {
    	size_t anzahl = 1 ;
    	for ( int j = str.size() - 1 ;  j >= 0 ;  --j )
    		if ( str[ j ] == str[ j - 1 ] )
    			++anzahl ;
    		else
    			break ;
    
    	return anzahl ;
    }
    
    int main()
    {
    	string zustand = "AAA";
    	cout << "[" << zustand << "]" << endl ;
    
    	string kopie ;
    	for ( char c = 'A' ;  c <= 'C' ;  ++c )
    	{
    		// cout << c << endl ; // #########
    
    		// Modus 1
    		kopie = zustand ;
    		if ( zustand[ zustand.size() - 1 ] != c )
    		{
    			kopie[ zustand.size() - 1 ] = c ;
    			cout << kopie << endl ;
    		}
    
    		// Modus 2
    		kopie = zustand ;
    		size_t aktuellePos = zustand.size() - anzGleicheZeichenAmEnde( zustand ) ;
    		if ( zustand[ aktuellePos ] != c && zustand[ aktuellePos - 1 ] != c)
    		{
    			kopie[ aktuellePos - 1 ] = c ;
    			cout << kopie << endl ;
    		}
    
    	}
    
    	cout << endl ;
    
    	return 0 ;
    }
    

    Danke,
    Thilo



  • Ah, unzulässiger Indexzugriff auf zustand[ -1 ]. Problem gelöst. Danke 😉



  • Deine Funktion anz... arbeitet falsch.

    str [j-1] wird auch für j=0 evaluiert.



  • mgaeckler schrieb:

    Deine Funktion anz... arbeitet falsch.

    str [j-1] wird auch für j=0 evaluiert.

    Wieso wirft da string keine exception oder verhält sich nicht sonst irgendwie deterministisch?



  • mgaeckler schrieb:

    Wieso wirft da string keine exception oder verhält sich nicht sonst irgendwie deterministisch?

    Wenn du eine Prüfung willst, musst du at verwenden. Ansonsten ist UB UB, was soll daran deterministisch sein?



  • manni66 schrieb:

    mgaeckler schrieb:

    Wieso wirft da string keine exception oder verhält sich nicht sonst irgendwie deterministisch?

    Wenn du eine Prüfung willst, musst du at verwenden. Ansonsten ist UB UB, was soll daran deterministisch sein?

    ja eben. Ub ist nicht deterministisch. Es gefällt mir nicht, daß der Standard hier UB erlaubt.



  • Weil man keine Rangechecks braucht, wenn man keine Rangechecks braucht?

    manni66 schrieb:

    Wenn du eine Prüfung willst, musst du at verwenden.



  • Wobei die Compiler im Debug Modus auch beim operator[] Rangechecks mit Assertionen eingebaut haben, jedenfalls der MSVC. Das knallt dann gewöhnlich sofort.



  • Swordfish schrieb:

    Weil man keine Rangechecks braucht, wenn man keine Rangechecks braucht?

    manni66 schrieb:

    Wenn du eine Prüfung willst, musst du at verwenden.

    Das ist allerdings auch ein guter Punkt. Allerdings hole ich mir in solchen Fällen immer einen Rawpointer.


Log in to reply