Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Stack Problem

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 ]
000
21.10.2007, 11:16 Uhr
power



Hi.

Ich soll nen Stack programmieren. Beim compilieren gibt es keine Fehler, beim ausführen jedoch bringt er einen Speicher Fehler.

Ich finde den Fehler aber nicht.

Downloaden kann man die Files hier.

Hier nochmal die 3 Dateien:

stack.h

C++:
#ifndef MYSTACK15102007  
#define MYSTACK15102007

struct Stack {
    unsigned int depth; // Tiefe des Stacks
    char *content;        // Inhalt des Stacks
    unsigned int top;    // Index des obersten Elements
} ;

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


#endif



stack.cpp

C++:
#include "stack.h"
#include <stdlib.h>

Stack* createStack(unsigned int laenge)
{
    Stack *p;
    p=(Stack*) malloc (sizeof(Stack));
    p->content=(char*) malloc (laenge * sizeof(char));
    p->top=-1;
    p->depth=laenge;
    
    return p;
}


void push(Stack *p, char x)
{
    p->top++;
    p->content[p->top]=x;
}

char pop(Stack *p)
{
    if(p->top==-1)
        exit(1);

    p->top--;
    return p->content[p->top+1];
}

int isEmpty(Stack *p)
{
    if(p->top!=-1)
        return 1;
    else
        return 0;
}



void destroyStack(Stack *p)
{
    free(p->content);
    free(p);
}






main.cpp

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


int main()
{
// Test der Datenstruktur STACK
    Stack *s;
    s=createStack(3);
    push(s,'a');
    push(s,'b');
    push(s,'c');
    push(s,'d');
    while (! isEmpty(s))
        cout << pop(s) << endl;
    pop(s);
    destroyStack(s);
    cin.ignore();
    return 0;
}



gruß power
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.10.2007, 11:23 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
du prüfst nicht ob du überhaupt noch platz aufm Stack hast. aktuell erzeugst du dir sozusagen einen Stackoverflow - weil du eben nur 3 plätze hast, aber 4 draufpusht.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.10.2007, 12:26 Uhr
power



okay...hast recht

habe es gändert:


C++:
void push(Stack *p, char x)
{
    if(p->top==p->depth-1)
        cout << "Kein Platz mehr auf dem Stack" << endl;
    else
    {
        p->top++;
        p->content[p->top]=x;
    }
}




Ich kenne mich noch nicht so mit C++ aus, aber in der main Funktion wird der Stack ja wieder gelöscht. Warum werden die Buchstaben nicht ausgeben?
Ich weiß nicht, wie ich das in C++ schreibe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.10.2007, 15:12 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja. unsigned int kennt EIGENTLICH kein -1, d.h da kann dir schonmal mist passieren. Warum benutzt du nicht 0 bis depth-1? d.h das dein positionszeiger immer auf den nächsten freien platz zeigt.

Ansonsten musste mal mit nem Debugger schaun worauf er genau immer zugreift, evtl haste da irgendwo eine positionsangabe vergeigt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.10.2007, 18:14 Uhr
power



Also, ich habe jetzt deinen Einwand auch geändert.

Aber jetzt will er die letzten beiden Buchstaben nicht mehr einfügen.

Jetzt gibt er mir zwei mal "Kein Platz mehr auf dem Stack" aus.

Des Weiteren gibt er auch nicht die Buchstaben beim Funktionsaufruf von "pop" aus.

Hier noch einmal mein geänderter Quellcode:


C++:

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

Stack* createStack(unsigned int laenge)
{
    Stack *p;
    p=(Stack*) malloc (sizeof(Stack));
    p->content=(char*) malloc (laenge * sizeof(char));
    p->top=0;
    p->depth=laenge-1;
    
    return p;
}

void push(Stack *p, char x)
{
    if(p->top>p->depth)
        cout << "Kein Platz mehr auf dem Stack" << endl;
    else
    {
        p->content[p->top]=x;
        p->top++;
    }
}

char pop(Stack *p)
{
    p->top--;
    return p->content[p->top+1];
}

int isEmpty(Stack *p)
{
    if(p->top!=0)
        return 1;
    else
        return 0;
}



void destroyStack(Stack *p)
{
    free(p->content);
    free(p);
}



Kannste mir nochmal helfen?
Irgendwie raff ich es nicht!

::::: EDIT ::::::
Wegen des Stacks habe ich gefunden

Aber es werden immer noch nicht die Buchstaben bei pop ausgegeben!

Dieser Post wurde am 21.10.2007 um 18:38 Uhr von power editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.10.2007, 18:46 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



C++:
p->depth=laenge-1; // <-- 1. Fehler bzgl zu wenig platz.

return p->content[p->top+1]; // da muss das +1 weg.


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.10.2007, 18:57 Uhr
power



nee, das mit dem platz geht so!

Jetzt wird nur noch einmal ausgegeben, dass kein Platz mehr auf dem Stack ist. Ist ja auch richtig so!

Und die "+1" müssen auch bleiben, denn ich dekrementiere ja top erst um 1, damit er auf ein Element unter dem, was "gelöscht" werden soll zeigen soll. Und dann brauch eich ja wieder top+1 um das Element, was gelöscht werden soll, auszugeben!


Also von daher funktioniert alles so, wie es soll!
Hier nochmal der Quellcode:


C++:
#include <iostream>
#include <stdlib.h>
#include "stack.h"
using namespace std;

Stack* createStack(unsigned int laenge)
{
    Stack *p;
    p=(Stack*) malloc (sizeof(Stack));
    p->content=(char*) malloc (laenge * sizeof(char));
    p->top=0;
    p->depth=laenge-1;
    
    return p;
}

void push(Stack *p, char x)
{
    if(p->top>p->depth)
        cout << "Kein Platz mehr auf dem Stack" << endl;
    else
    {
        p->content[p->top]=x;
        p->top++;
    }
}

char pop(Stack *p)
{
    p->top--;
    return p->content[p->top+1];
}

int isEmpty(Stack *p)
{
    if(p->top!=0)
        return 1;
    else
        return 0;
}



void destroyStack(Stack *p)
{
    free(p->content);
    free(p);
}




Das einzige problem, was noch besteht, ist, dass die Buchstaben nicht ausgegeben werden sollen! Und ich nicht weiß, ob die Anweisung in der Main Funktion "cout << pop(s) << endl;" so richtig ist. Ich glaube, es liegt daran.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.10.2007, 19:03 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


aso sie sollen nicht ausgegeben werden. warum gibst du sie denn dann in der main aus?

Ansonsten lieferst du die falsche Position zurück wenn du da nochma +1 machst.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.10.2007, 19:08 Uhr
power



ups...nee, sie sollen ja ausgebeben werden! ABER: sie werden nicht ausgeben!


aaaaaaaaaaaaaaaaaaaaaaaaaaaaah jetzt weiß ich, was ich falsch gemacht habe! bin immer noch bei meiner -1! ohoh


Okay, geändert! Aber die schei... Buchstaben werden immernoch nicht ausgegeben! ich krieg hier gleich nen rappel!!!


Dieser Post wurde am 21.10.2007 um 19:10 Uhr von power editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.10.2007, 20:52 Uhr
0xdeadbeef
Gott
(Operator)


Deine pop-Funktion beendet das Programm mit exit(1), wenn der Stack leer ist, also

C++:
int main()
{
// Test der Datenstruktur STACK
    Stack *s;
    s=createStack(3);
    push(s,'a');
    push(s,'b');
    push(s,'c');
    push(s,'d');
    while (! isEmpty(s))
        cout << pop(s) << endl;
    pop(s); // <-- hier
    destroyStack(s);
    cin.ignore();
    return 0;
}


Erstens wird deshalb alles, was danach kommt, nicht mehr ausgeführt, und zweitens kümmert sich exit einen Dreck um Destruktoren etc. Das heißt, cout wird nicht geflusht, und du kriegst die Ausgabe nie zu sehen.

Nimm das da raus, und schreib am besten die pop-Funktion gleich so um, dass sie ggf. nicht gleich das ganze Programm abstürzen lässt.

Außerdem...warum schreibst du eigentlich einen C-Stack in einem C++-Programm?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


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: