Zeichenketten-Stack



  • Hallo,

    ich habe demnächste eine Prüfung in C++ und bin leider nicht wirklich die talentierteste ;'-(

    Jetzt plage ich mich gerade mit einer Übung zu Pointern herum. Die eigentliche Pointer-Geschichte hab ich soweit auch noch verstanden, aber bei einem Beispiel zu einem Zeichenketten-Stack hört es auf....

    class cStack {
      int top;
      char* v[Start];
      int MAX;
     public:
      cStack() { Reset(); top = 0; }
      void Reset() { MAX = Start; }
      void Push(char* c);	
      void Pop(char** rChar);			
      void getTop(char** rChar);
    };
    
    void cStack::Pop (char** rChar) {
    	if (top > 0)
    	{
    		*rChar = new char(strlen(v[--top]));
    		strcpy(*rChar,v[top]);
            return;
    	} else
    	{
    		*rChar = new char(13);
    		strcpy(*rChar,"Stapel leer!");
    		return;
    	}
    }
    

    Was ist char** ? Also was bedeuten 2 Sternchen? Der Aufruf aus der Main sieht dann so aus:

    char* c;
    stack.Pop(&c);
    

    Dort übergebe ich die Speicheradresse des Zeigers c an die Funktion Pop, richtig?
    Aber wie damit in der Funktion pop weiter vorgegangen wird, ist mir schleiherhaft 😞

    Wäre ganz, ganz lieb wenn mir das jemand erklären könnte.

    lg, Sarah



  • Hallo

    char* rChar* ist ein Pointer auf einen Pointer. Im Gegensatz zu einem "normalen" Pointer erlaubt dir dieses Konstrukt nicht nur die Instanz zu ändern, auf die der Pointer zeigt, sondern auch die Adresse des Pointer selber.
    In deinem Fall bedeutet das das in der Funktion Speicher für ein C-String erstellt. Die Adresse wird dann über den Funktionsparamter rChar zurückgegeben. Damit kannst du also der Funktion einen initialisierten Zeiger übergeben und bekommst dafür den initialisierten zurück.

    Übrigens ist dein Codeausszug ein eher mäßger Mischmasch aus C und C++. In C++ würde man produktiven Code wesentlich anders schreiben.

    bis bald
    akari



  • SarahSchoeneberg schrieb:

    Was ist char** ? Also was bedeuten 2 Sternchen?

    Na, ein Zeiger auf einen Zeiger. 'char*' ist eine Variable, die auf ein 'char' zeigt. Und 'char**' zeigt auf eine Variable, die auf ein 'char' zeigt.

    [quoteDort übergebe ich die Speicheradresse des Zeigers c an die Funktion Pop, richtig?[/quote]
    Genau.

    Aber wie damit in der Funktion pop weiter vorgegangen wird, ist mir schleiherhaft 😞

    Ja, ist auch kranker Code. Die Funktion schaut, ob Speicher verfügbar ist ('top > 0'). Wenn das so ist, dann wird der aktuelle Wert des Stacks in den verfügbaren Speicher kopiert. Dazu wird zunächst genügend Speicher angelegt (daher übergeben wir auch einen Zeiger auf den Zeiger auf char, weil wir den Zeiger auf char hier manipulieren und das geht nicht, wenn wir ihn direkt übergäben). Dann wird per 'strcpy' die oberste Zeichenkette des Strings in den nun verfügbaren Puffer kopiert.

    Sollte der Stack leer sein, wird stattdessen eine Fehlermeldung zurückgegeben.

    In C++ würde man das aber ganz anders machen, dafür gibt es die 'std::string'-Klasse:

    class Stack {
      int top;
      std::string v[Start];
      int MAX;
     public:
      Stack() { Reset(); top = 0; }
      void Reset() { MAX = Start; }
      void Push(std::string const& s);   
      std::string Pop();
      std::string getTop();
    };
    
    std::String Stack::Pop ()
    {
        if (top > 0)
            return v[--top];
        else
            return "Stapel leer!";
    }
    


  • Vielen Dank für die beiden Antworten, ich denke ich hab´s jetzt ein wenig besser verstanden 🙂

    Muss aber gleich noch eine ähnliche Frage stellen....

    int& f4() {
       int i;
       i = 234;
       return i;
       }
    
    int main() {
       int k;
       k = f4(); // was passiert?
       cout << " f4: " << k << endl;
       return 0;
       }
    

    Angeblich soll in diesem Quellcode eine grobe Fahrlässigkeit drin stecken. Interesanterweise läuft der bei mir aber wunderbar ab und es erscheint als Ausgabe die 234.
    Ich muss gestehen ich weiß hierbei nicht wofür das & im Funktionskopf "int& f4()" steht. Ich hätte jetzt drauf getippt dass nur die Speicheradresse vom Rückgabewert zurückgegeben wird, dieser Speicherort aber aufgrund der beendeten Funktion nicht mehr existiert. Aber alles läuft ja bestens ab...
    help 😕



  • Hallo

    Ich hätte jetzt drauf getippt dass nur die Speicheradresse vom Rückgabewert zurückgegeben wird, dieser Speicherort aber aufgrund der beendeten Funktion nicht mehr existiert.

    Völlig richtig. Das & bedeutet in diesem Fall eine Referenz.

    Aber alles läuft ja bestens ab...

    Zufall. Es könnte genausogut deinen PC abstürzen lassen. Das ist schlicht und ergreifend ungültig, weil auf nicht gültigen Speicher zugegriffen wird.

    bis bald
    akari



  • super, dann war meine Vermutung ja sogar richtig 🙂
    vielen lieben Dank!


Anmelden zum Antworten