merkwuerdiges problem mit variablen



  • Hi Leute...
    Mein Problem ist folgendes:

    // zum herausfinden der string laenge
    int string_laenge( char wort[] )
    {
    	int a = 0;
    	while( wort[a] != '\0' )
    	{
    		a++;
    	}
    
    	return a;
    }
    
    // zum verschluesseln des wortes
    verschluessele( char wort[], char wort_ver[] )
    {
    	int laenge = string_laenge( wort );
    	for( int a = 0; a < laenge; a++ )
    	{
    		wort_ver[a] = '_';
    		cout << " a: " << a << " : " << wort << " || ";
    	}
    	gotoxy( 1, 15 );
    	cout << " _____ WORT : _____ " << wort;
    }
    

    In der Schleife in "verschluesseln" wird ja eigentlich bloss der Inhalt der Variablen wort_ver veraendert. Denkste... Mit zweiten Zeile in der Schleife gebe ich fuer jeden Zeilendurchgang auch das andere Wort aus (also die Variable wort). Und was sieht man. Diese wird auch veraendert. 😞 Ich weiss nicht woran das liegt... 😞
    Kann mir jemand helfen?
    MfG Aoeke



  • übergibst du vielleicht das selbe char array 2 mal ?

    Devil



  • Also ich rufe die Funktion so auf:

    char wort[] = "maus";	// wort normal
    	char wort_ver[] = "";	// wort verschluesselt
    
    	verschluessele( wort, wort_ver );
    
    	cout << "Wort: " << wort_ver;
    

    Also ich uebergebe eigentlich 2 verschiedene arrays... 😞
    mfg aoeke



  • Ähm, du übergibst die arrays aber nicht leer, oder ?
    Ich mein, so haben sie beide den selben Inhalt 😉

    Devil



  • mhm.. nein, habs editiert... 😃
    mfg aoeke



  • hm, also macht er das auch, wenn beide arrays nicht leer sind ? 😉
    Du must schon den passenden Speicher jeweils allokieren,
    wort_ver ist in diesem fall ein leeres array.

    Devil



  • hrmm.. *huestel*...

    allokieren

    Hilfst du mir mal eben auf die Spruenge... 😃
    MfG aoeke



  • // zum herausfinden der string laenge 
    int string_laenge( char * wort[] ) 
    { 
        int a = 0; 
        while( wort[a] != '\0' ) 
        { 
            a++; 
        } 
    
        return a; 
    } 
    
    // zum verschluesseln des wortes 
    char* verschluessele( char * wort[]) 
    { 
        int laenge = string_laenge( wort ); 
        char * wort_ver = new char[laenge]; // Speicher allokieren ;D der genauso groß ist, wie "wort"
    
        for( int a = 0; a < laenge; a++ ) 
        { 
            wort_ver[a] = '_'; 
            cout << " a: " << a << " : " << wort << " || "; 
        } 
        gotoxy( 1, 15 ); 
        cout << " _____ WORT : _____ " << wort; 
        return wort_ver;
    }
    


  • Aoeke schrieb:

    Also ich rufe die Funktion so auf:

    char wort[] = "maus";	// wort normal
    	char wort_ver[] = "";	// wort verschluesselt
    
    	verschluessele( wort, wort_ver );
    
    	cout << "Wort: " << wort_ver;
    

    Also ich uebergebe eigentlich 2 verschiedene arrays... 😞
    mfg aoeke

    Offensichtlich wird wort_ver vor wort im speicher abgelegt.

    wort_ver : '\0'
    wort : 'm'
    'a'
    'u'
    's'
    '\0'

    wort_ver ist ein Array mit der Groesse 1.
    Da die Funktion verschluessele uber die Arraygrenzen von wort_ver
    hinausschreibt, wird der Speicher , in dem das Array wort liegt,
    vollgeschrieben.

    Uebrigens, warum benutzt du nicht strlen



  • @Saiyaman

    // zum verschluesseln des wortes 
    char* verschluessele( char * wort[]) 
    { 
        int laenge = string_laenge( wort ); 
        char * wort_ver = new char[laenge]; // Speicher allokieren ;D der genauso groß ist, wie "wort"
    
        for( int a = 0; a < laenge; a++ ) 
        { 
            wort_ver[a] = '_'; 
            cout << " a: " << a << " : " << wort << " || "; 
        } 
        gotoxy( 1, 15 ); 
        cout << " _____ WORT : _____ " << wort; 
        return wort_ver;
    }
    

    Schlechte Lösung. Du nimmst damit den Aufrufer in die Pflicht, den Speicher von wort_ver freizugeben, obwohl er ihn nicht reserviert hat.
    Besser: reseviere ausserhalb von verschluessele().



  • Oh ich habe gar nicht mitbekommen, dass es hier noch was gab... 😃
    So... Also ich habe das Problem jetzt geloest, indem ich jetzt wirklich ausserhalb von der Funktion schon die Laenge festgelegt habe.
    Also so:

    char wort[80];    // wort normal
    char wort_ver[80];    // wort verschluesselt
    

    Naja, 'wort' bekommt dann irgendwann einen wert zugewiesen und anschliessend wird verschluesselt.
    Also danke fuer eure Bemuehungen.
    MfG Aoeke


Anmelden zum Antworten