Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Stack Liste » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 10 Beiträge
as_string

Hallo,

ich hab das mal in ein kleines Programmchen geschrieben, zumindest wie ich meine, dass es sinnvoll ist.
Ich hab es nicht wirklich getestet, nur mal kompilieren lassen und dabei sicher gestellt, dass keine Syntaxfehler drin sind. Andere Fehler können natürlich noch gut drin sein...

Aber insgesamt: Es bringt wenig, wenn wir Dir einfach Musterlösungen geben. Man lernt das nur durch selber-machen. Klar ist das am Anfang schwer und so, aber anders geht's halt kaum...

Gruß
Marco

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
#include <stdlib.h>

typedef struct frame_data {
	int retval;
	int param[16];
	int pcount;
} frame_data_t;

typedef struct call_frame {
	frame_data_t *data;
	struct call_frame *previous;
} call_frame_t;

typedef struct call_stack {
	call_frame_t *top;
	int size;
} call_stack_t;

call_stack_t call_stack;

void initialize() {
	call_stack.size = 0;
	call_stack.top = NULL;
}

void push(frame_data_t *frame_data) {
	call_frame_t *call_frame = (call_frame_t *) malloc(sizeof(call_frame_t));
	call_frame->previous = call_stack.top; // previous soll auf den call_frame zeigen, der bisher top war
	call_stack.top = call_frame; // top soll jetzt auf den neuen zeigen
	call_stack.size++; // die Groesse des Stacks (sagt man Tiefe?) hat sich um eins erhoeht 

	call_frame->data = frame_data; // Verweis auf den neuen (uebergebenen) Datensatz
}
lilli.

Ich verstehe es leider nicht. Ich bin da echt noch in den Anfängen.
push hängt von frame_data_t und call_stack_t ab.

void push (frame_data_t *frame)
{


if (s == NULL)
return;

frame= new_frame();
frame->value = value;

if (s->top == NULL) {
s->top = frame;
s->size = 1;
return;
}

st->previous = s->top;
s->top = frame;
s->size++;
}
as_string

Klar, das genügt doch auch, zumindest erstmal! Augenzwinkern

Schau Dir doch mal das Diagramm von Deinem ersten Post an. Das wäre die Situation nachdem einmal die Initialisierung gelaufen ist und dann dreimal ein push ausgeführt wurde.
Wie muss das push arbeiten, damit es nach drei Aufrufen diese Struktur herstellt?

Gruß
Marco
lilli.

Ich verstehe das leider nicht, wir haben leider kein anderes Beispiel bekommen. Ich weis zwar was ein stack macht, aber nicht wie die einzelnen Operatoren arbeiten. Ich kenne push und Pop mehr nicht.
as_string

In der if-Anweisung sind ja die beiden "=="-Zeichen. Ich glaube die müssen zusammen stehen (das ist ein einziger Vergleichsoperator, der aus zwei Zeichen besteht, ein Leerzeichen würde daraus zwei einzelne "=" machen).
prev muss auf den vorhergehenden Stackeintrag zeigen, zumindest wenn das zweite Element eingetragen wurde. Das ist das, wo bisher top drauf gezeigt hatte. Umgekehrt muss top nachher auf den neuen Eintrag zeigen.

Schau mal, ob Du damit etwas anfangen kannst.

Gruß
Marco
lilli.

void push(frame_data_t *frame){

if((s = (call_frame_t*)malloc sizeof(call_frame_t))) = =NULL){

perror("malloc);
exit(EXIT_FAILURE);
}

s->data = frame;
s-> prev= NULL;
return s;

Ich habe leider keine Ahnung wie es weitergehen soll.
as_string

Zitat:
Original von lilli.
void push(frame_data_t *frame){

frame_data_t *frame;

Wenn Du frame schon als Übergabeparameter hast, dann brauchst Du das nicht nochmal zu deklarieren. Das ist dann quasi schon "implizit" deklariert, sprich die Variable ist dann einfach vorhanden.
Aber die Funktion ist da ja noch nicht fertig. Die eigentliche Arbeit muss ja noch gemacht werden...

Gruß
Marco
lilli.

Ansatz zu 3.)

void push(frame_data_t *frame){

frame_data_t *frame;

if((s = (call_frame_t*)malloc sizeof(call_frame_t))) = =NULL){

perror("malloc);
exit(EXIT_FAILURE);
}
as_string

Fast Augenzwinkern
Der Typ ist dann "frame_data_t", sonst müsstest Du wieder "struct" vorne dran schreiben, was aber unsinnig wäre, wenn Du so wie so schon den Typ mit typedef definiert hast.

Gruß
Marco
lilli.

stimmt es so:
1.)
typedef struct call_frame{
frame data *data;
struct call_frame *previous;
}call_frame_t;
2.)

call_stack.size = 0;
call_stack.top = NULL;
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen.