Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » createStack

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 <
020
25.10.2008, 11:50 Uhr
KFC Embryo
Ein Huhn


Hallo,

ok mein Programm läuft jetzt soweit jetzt kommt das nächste die Funktionen Teil einer Klasse werden zulassen, sprich Methoden erstellen, folgendes habe ich:

Stack.h

Code:

#ifndef KLASSE_STACK
#define KLASSE_STACK

class Stack{
    
private:
    unsigned int depth;
    char         *content;
    unsigned int top;

public:
    void push(char);
    char pop();
    int isEmpty();
    void destroyStack();
    Stack* createStack(unsigned int)


};

#endif



Stimmt das so?
In einem anderen Thread wurde das Thema schon behandelt allerdings habe ich es nicht verstanden.



Funktionen.cpp


Code:

#include <iostream>
using namespace std;
#include "stack.h"



Stack* createStack(unsigned int n){

    content = (Stack*) malloc(sizeof(Stack));
    s = (char) malloc(n*sizeof(char));
    top = n;
    depth = 0;
    return s;
}


    

void Stack::push(char c){

    if(top < depth){
         content++;
        *content=c;
         top++;
         cout << "Hinzugefuegt" << endl;
    }
    else{
        cout << "Stack ist voll!" << endl;
    }
}

char Stack::pop(){

    if(top >= 1){
        char c = *content;
        *content = 0;
         top--;
         content--;
         cout << "Herausgeholt" << endl;
         return c;
    }
    else{
        cout << "Stack ist leer" << endl;
        return 0;
    }
}


void Stack::destroyStack(){
    
    for(int i=top; i>=1; i--)
        content--;
        content++;
    
    free(content);
    s.free();
}

int Stack::isEmpty(){

    if(top>=1){
        return 0;
    }else{
        return 1;
    }
}



Stack.cpp

Code:

#include <iostream>
using namespace std;
#include "stack.h"


int main(){
    
    
    createStack s(3);
    s.push('a');
    s.push('b');
    s.push('c');
    s.push('d');
    
    while((int i=s.isEmpty())!=1){
        cout << s.pop() << endl;
    }
    s.pop();
    s.destroyStack();
    cin.ignore();
    return 0;
}



Ich bekomme eine Reihe von Fehlern allerdings möchte ich die nicht alle hier rein schreiben.
Ich denke das es erkennbar ist was Falsch ist, für jemanden der Erfahrung hat.
Kann man ja anhand des Cods schön erkennen.

Danke.
Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
26.10.2008, 12:54 Uhr
ao

(Operator)


Eine Klasse Stack braucht keine createStack-Methode, sondern einen Konstruktor. Dasselbe für destroyStack, das übernimmt der Destruktor. Lies in einem guten Buch über objektorientiertes Programmieren nach, was das ist. Was du da schreibst, ist kein C++, das ist bestenfalls "C mit Klassen".

Und dann mach erstmal EINFACHE Grundübungen, Definieren, Implementieren und Verwenden von Klassen, bevor du dich an so Sachen wie Memory-Management begibst. Das ist nämlich schon mindestens Stufe 2.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
26.10.2008, 19:18 Uhr
KFC Embryo
Ein Huhn


Ok dann lassen wir das mal so stehen das es C mit Klassen ist.
Das mit der Stufe 2 weiß ich nicht ob man das so sagen kann.

Es ist Übung 1 im Fach Programmierung III.
Ich hatte bis hierher weder mit C++ zu tun als auch mit Klassen.
Die Übungen sind ja dafür da um es zu lernen.

Deswegen würde ich mich schon freuen wenn du oder irgend jemand anderes eine Fehleranalyse machen könnte.
Ich sehe dann ja was ich falsch gemacht habe.
Und werde dann später lesen wie es funktioniert wenn ich einen bestehenden Zusammenhang habe.
Das ist denke ich effizienter wie ein Buch zu lesen ohne zu wissen was man eigentlich brauch.

Und wie gesagt seht mir die Syntaxfehler bitte nach, wie bereits gesagt ich hatte bis hier her mit C++ nicht viel zu tun.

Ich bedank mich schon mal für die Hilfe.

Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
26.10.2008, 21:53 Uhr
Hans
Library Walker
(Operator)


Hi,

ohne jetzt aufdringlich wirken zu wollen: in Zukunft solltest Du wirklich vorher angeben, ob die Aufgabe mit C oder C++ gelöst werden soll. Denn Du siehst ja jetzt wohl selber, das es da ein paar erhebliche Unterschiede gibt. Sofern bei den Aufgaben irgendwelche Codefetzen vorgegeben werden, wäre es vielleicht auch sinnvoll, diese mit anzugeben.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
27.10.2008, 08:28 Uhr
ao

(Operator)



Zitat von KFC Embryo:
Deswegen würde ich mich schon freuen wenn du oder irgend jemand anderes eine Fehleranalyse machen könnte.

Kann ich machen, wenn ich heute abend Zeit finde. Aber eigentlich solltest du als Student in "Programmierung III" mit dem Stichwort "Konstruktor" schon was anfangen können. Oder zumindest ne Ahnung haben, wo du es nachlesen kannst.

Gibts eigentlich heutzutage keine Lerngemeinschaften mehr? Wir hatten sowas damals, und was einer nicht wusste, hatte ein anderer zumindest schon mal gehört.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
29.10.2008, 19:19 Uhr
KFC Embryo
Ein Huhn


Hallo,

so ich habe es jetzt fertig und es läuft.
Bis auf die syntaktischen Fehler:


Code:

*content = c




Das könnte man eventuell noch so lösen, denke ich.


Code:

content[i] = c




Mit einer for-Schleife füllen.
Das sind jetzt die syntaktischen Fehler von denen ich weiß das sie Falsch sind.
Jetzt würde ich euch bitten mir noch andere zu nennen wenn es denn noch welche gibt.

Das logische Problem lag bei der Ausgabe der Zeichen.
Ich habe erst dekrementiert und dann ausgegeben dadurch ist der Zeiger um eins verrutscht und dereferenzierte natürlich "Gulasch".

Also folgendes Programm läuft, weißt aber syntaktische Fehler auf:

Die main.cpp:


Code:

#include <iostream>
using namespace std;
#include "stack.h"


int main(){
    
    Stack s;
    s.createStack(3);

    s.push('a');
    s.push('b');
    s.push('c');
    s.push('d');

    while(s.isEmpty() != 0)
        cout << s.pop() << endl;
        
    s.pop();
        
    s.destroyStack();
    cin.ignore();
    return 0;
}



Die Funktion.cpp:


Code:

#include <iostream>
using namespace std;
#include "stack.h"

char* Stack::createStack(unsigned int n){
    
    
    content = new char[n];
    top=n;
    depth=0;
    return content;

}

void Stack::push(char c){

    if(depth < top){  
         *content = c;
         content++;    
         depth++;
         cout << "Hinzugefuegt" << endl;
    }
    else{
         cout << "Stack ist voll!" << endl;
    }
}

char Stack::pop(){

    if(top>0){
      
         content--;
         top--;
         char c = *content;    
         cout << "Herausgeholt: " << endl;
         return c;
    }
    else{
         cout << "Stack ist leer" << endl;
         return 0;
    }
}

int Stack::isEmpty(){

    if(top == 0){
        return 0;
    }else{
        return 1;
    }
}

void Stack::destroyStack(){

    delete []content;
}




Die Stack.h:


Code:

class Stack{
    
private:
    unsigned int depth;
    char         *content;
    unsigned int top;

public:
    void push(char);
    char pop();
    int isEmpty();
    void destroyStack();
    char* createStack(unsigned int);
};



Ich bedanke mich.

Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?

Dieser Post wurde am 29.10.2008 um 19:20 Uhr von KFC Embryo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
31.10.2008, 23:04 Uhr
Lensflare



Also syntaktische Fehler sind hier nicht drin denke ich.
Mein Compiler hat alles fehlerfrei kompiliert.
Bist du sicher, dass du auch Syntaxfehler meintest?

Die Datei Funktion.cpp sollte stack.cpp heissen.
Normalerweise ist es so, dass man eine Klasse in eine .h und eine .cpp aufteilt wobei der Name der beiden Dateien dem Klassennamen entspricht.

Dann solltest du wie schon erwähnt Konstruktoren und Destruktoren verwenden.
aus

C++:
char* Stack::createStack(unsigned int n)
void Stack::destroyStack()


wird

C++:
Stack::Stack(unsigned int n) //Konstruktor
Stack::~Stack() //Destruktor


Den Inhalt der beiden Methoden kannst du eigentlich übernehmen.

Dann wird der Konstruktor automatisch aufgerufen wenn du das Objekt erzeugst
und der Destruktor, wenn es zerstört wird:

C++:
{
    Stack s(3); //Konstruktor wird aufgerufen
}
//hier wird der Destruktor aufgerufen, weil der Scope verlassen wird



und dann, wie du richtig gemerkt hast, ist es besser den content als array zu behandeln und nicht als zeiger, den man inkrementiert und dekrementiert, wenn man sich schon den Index des höchsten Elements merkt.

Du hast in createStack top auf n gesetzt und depth auf 0. deswegen gehe ich davon aus, dass top die maximale Höhe des und depth die Höhe des aktuell höchsten Elements ist.

dann würden die Methoden so aussehen:

C++:
void Stack::push(char c){

    if(depth < top){
         content[depth] = c;
         depth++;
         cout << "Hinzugefuegt" << endl;
    }
    else{
         cout << "Stack ist voll!" << endl;
    }
}

char Stack::pop(){

    if(depth>0){
         depth--;
         char c = content[depth];
         cout << "Herausgeholt: " << endl;
         return c;
    }
    else{
         cout << "Stack ist leer" << endl;
         return 0;
    }
}

int Stack::isEmpty(){

    if(depth == 0){
        return 0;
    }else{
        return 1;
    }
}



Noch einige Anmerkungen:

Vielleicht ist es nicht so gut, bei pop 0 zurückzugeben, falls der Stack leer ist. Denn 0 könnte ja auch ein gültiges Zeichen sein, das man gerade aus dem Stack geholt hat.
Es ist ja nicht verboten 0 in den Stack zu pushen.
Da verweise ich wieder an das was ao gesagt hat -> Das Zeichen über Referenzübergabe "herausholen"

Wäre es nicht besser, wenn isEmpty() bool anstelle von int zurückgeben würde?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 31.10.2008 um 23:08 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: