Frage zum Stack

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Frage zum Stack

Beitrag von cloidnerux » Di Jan 22, 2013 11:05 pm

Assembler ist eine Programmiersprache, Prozessor aber eine Hardware. Welcher Zusammenhang besteht zwischen den beiden (Assembler und Prozessor) und dem Stack? Wie sieht überhaupt eine Datenstruktur aus? Welche Aufgaben hat diese und wie arbeitet sie?
Also, dein Prozessor ist Hardware, da hast du recht. Aber der Prozessor ist der Teil deines Computers, der deinen Code ausführt. Und um dein Programm auszuführen, benötigt er einen Ablaufplan, bzw eine Arbeitsanweisung, eben dein Programm. Aber dein Prozessor ist keine Wundermaschine, du kannst ihm nicht sagen "Rechne mal Pi aus". Im Grunde kann man ihm nur recht wenig Befehle geben, wovon jeder eine Eindeutige Nummer hat(Damit wären wir wieder bei den Zahlen). Ein Befehl alleine macht kein Programm aus, sondern erst die Kombination dieser.
Und wenn du eben direkt mit diesen Befehlen programmieren willst, nutzt du Assembler. In Assembler bekommt jeder Befehel einen sehr verkürzten Namen, z.B "mov", was kurz für "move" ist und Werte "verschiebt", also kopiert. Diese Befehle werden von einem "Assembler" genannten Programm direkt in eben die Hardwarebefehle umgesetzt, ohne Umwege. Damit ist Assembler die "Maschinensprache", weil das was du an Anweisungen hinschreibst auch so ausgeführt wird.
Assembler nutzt aber keiner zum Programmieren(es gibt einige Ausnahmen), da selbst einfacher Code viel zu viel Assemblercode bedeutet. Ein Hello-World in Assembler wäre sehr viel mehr Code als ein Hello-World in C.

Was eine Datenstruktur ist, hatten wir hier schon einmal. Eine Datenstruktur ist ein Überbegriff für die Organisation von Daten in einer gewissen Struktur.
Daten an sich können einfach nur Zahlen sein, aber z.B auch Messwerte wo du sehr viele Zahlen mit einem Zeitpunkt zu einem Datensatz verknüpfst.
Eine einfache Datenstruktur wäre z.B schon ein Array, es liegen alle Daten hintereinenader im Speicher, man kann auf alle zugreifen. Das Problem ist, wenn du zur Laufzeit noch nicht wissen kannst, wie viele Datensätze du hast und man mal nicht eben für 1000 Elemente Speicher reservieren kann, dann braucht man Datenstrukturen die dynamisch Speicher allozieren und alle Elemente verwalten.
Bekannte Datenstrukturen wären Listen, Bäume, Steaks, Heaps, Hashtabels, sortiere Listen, etc.
Dann geht es nicht nur darum, Daten irgendwie zu speichern und zu verwalten, sondern auch um Sortierungen und Zugriffsbeschränkungen zu geben. So kann man aus einer sortierten Liste sehr viel schneller die Elemente der Sortierung nach zu Bearbeiten, als sie erst zur Laufzeit aus einem Array heraus zu sortieren und dann zu verarbeiten.

Dann gibt es nicht DEN Stack, ein Stack ist auch NUR eine Datenstruktur, dein Beispiel ist z.B eine Implementation eines Stacks für beliebige Daten.
Worüber du redest ist der Programm-Stack, das muss klar sein. Der Programm-Stack(ich nenne es einfach mal pStack) ist ein essenzieller Teil eines Programms. So essenziell, dass man Funktionalität des pStacks direkt in den Prozessor gepackt hat, um Programme schneller auszuführen. Daher gibt es auch entsprechende Register im Prozessor, die eben Daten des pStacks enthalten, um nicht dauernd Daten aus dem Ram laden.
Was ist ein Register, wie funktioniert es und wofür brauche ich das für den Stack?
Ein Register ist ein Stück RAM, dass in der CPU direkt mit den funktionalen Komponenten verbunden ist.
Ganz wichtig: Kein Speicher, keine Werte, keine Pointer, keine Zahlen, keine Register sind irgendwie besonders. Erst in den Moment, wo man sowas in einen Kontext setzt, wird es wichtig und besonders. Ein Pointer ist nichts besonderes, im Ram ist das auch nur eine Zahl, eine von vielen. Aber in dem Moment, wo ich sage, dass dies eine Rücksprungadresse ist, in diesem Moment ist diese Zahl von Bedeutung, weil es einen Kontext hat.
Und so ist es auch mit den Registern. Das ist alles "nur" Ram. Aber im Prozessor sind bestimmte Register mit bestimmten funktionalen Komponenten verbunden. So gibt es ein Register "PC"(Program Counter), welches die aktuelle Adresse des auszuführenden Befehls beinhaltet. Es ist nichts besonders, nur ein Stückchen Speicher. Aber dadurch, dass dieser Speicher im Kontext des Prozessors einen wichtigen Wert beinhaltet, ist es wichtig.
Warum reichen die Rücksprungadressen nicht aus – warum muss man noch zusätzlich die Parameter sowie lokale Variablen einer Funktion sichern? Warum musste man eine ganze Datenstruktur (Stack) dafür erfinden und warum hat ein Prozessor sogar spezielle Stapelregister, die anscheinend nur dazu da sind, um die Daten im Stack zu verwalten/verarbeiten? Würde das nicht mit temporären Variablen ohne Stack funktionieren, die notwendige Informationen für den Funktionsaufruf temporär speichern?
Der Stack wurde nicht "erfunden", das Konzept gab es schon bevor es Computer gab, aber es wurde genutzt, weil es sich als Sinnvoll erwiesen hat.
Du redest von temporären Variablen und sprichst damit das Kernproblem an, warum man hier eine Datenstruktur nutzt. Wie groß sind denn deine Temporären Daten? Das weißt du nicht und daher brauchst du eine Struktur, die Dynamisch wachsen und schrumpfen kann: Der Stack.
Der Stack erfüllt auch ein weitere Kriterium: Sicherheit. Erst wenn alle Variablen, die beim Funktionsaufruf auf den Stack gelegt wurden herunter genommen wurden, kann das Programm nach der Funktion richtig weiter machen. Ist dem nicht der Fall, wird dein Programm crashen. Damit ist sichergestellt, das sich um alle Variablen gekümmert wird.
Der Prozessor hat entsprechende Stapelregister für den pStack, weil man so Zeit spart und schneller Rechnen kann.
Warum ist Integer bei den 64 bit Systemen größer? Warum hat man das nicht einheitlich gemacht und für 64 bit Systeme spezielle Datentypen eingeführt z.B. int64 ?
Weil Prozessoren kompliziert sind. Generell besteht ein Problem: Wenn du Zahlen berechnen willst, die außerhalb der vom Prozessor definierten Grenzen liegt(32/64) Bit, wird es rechen aufwendig. Um zwei 64-Bit Zahlen zu multiplizieren braucht man auf einem 32-Bit System viele Operationen, auf einem 64-Bit System nicht.
Zum anderen ist der Datentyp "int" noch nie fest Definiert gewesen. Auf alten Prozessoren kann er nur 16-Bit breit sein, auf modernen System kann er 64-Bit breit sein. Es gibt die Typen "long" und "long long", die etwas strikter definiert sind.
http://www.proggen.org/forum/viewtopic.php?f=21&t=2126 und http://www.proggen.org/forum/viewtopic.php?f=21&t=372 haben wir mal getestet, wie groß die einzelnen Variablen sind. Lies dir das mal durch und nimm es erstmal hin.
Wie bzw. warum muss man Stack implementieren? Ich habe es so verstanden, dass der Stack essentiell ist und IMMER verwendet wird, wenn man eine Funktion aufruft – also so gut wie immer, da die meisten Programme nur aus Funktionen bestehen – ohne globalen Variablen. Werden nur globale Variablen ohne Stack verwaltet bzw. irgendwo willkürlich an beliebigen Stellen im Arbeitsspeicher gespeichert?
Bitte auch hier wieder Unterscheiden: Ein Stack ist eine Datenstruktur, der pStack ist ein essentieller Teil eines Programms, dass von deinem Compiler erzeugt wird.
Sind Listen also eine andere Datenstruktur? Gibt es dafür auch ein Register im Prozessor? In dem Beispiel oben aus dem Youtube-Video werden aber die Daten mittels von Listen auf den Stack geschrieben, deshalb dachte ich, dass Listen bzw. Strukturen genau so wie Funktionen auf dem Stack liegen? (total verwirrt )
Listen sind Datenstrukturen. Die Register gehören zum pStack, haben also nichts damit zu tun, dass es eine Datenstruktur ist, sondern für den Programmfluss wichtig

MfG cloidnerux.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum Stack

Beitrag von Xin » Mi Jan 23, 2013 11:24 am

@cloidnerux: Guck mal auf den einen roten Link hier und dann auf den Text, den Du gerade geschrieben hast.
Da müsste sich doch was draus machen lassen ;-)
cloidnerux hat geschrieben:Bekannte Datenstrukturen wären Listen, Bäume, Steaks, Heaps, Hashtabels, sortiere Listen, etc.
Lecker :)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Frage zum Stack

Beitrag von forumnewbie » Mi Jan 23, 2013 2:58 pm

Zunächst möchte ich mich für diese ausführliche Antwort bedanken!


Folgende Fragen habe ich noch:
1. Wenn die Aufgabe lautet: Elemente auf den Stack legen und vom Stack nehmen und anzeigen, ist damit der Programm-Stack gemeint?

2. Ich kann leider den Stack von einer Liste nicht unterscheiden. Beides sind für mich Strukturen (Struct) mit einem Zeiger auf das nächste Element - auf die Speicherstelle im RAM/pStack?). Könnte jemand bitte ein SEHR einfaches Beispiel in C machen (ohne Schleifen oder if-Anweisungen) für eine Liste und einen Stack? Welche nur eine Angabe - Alter - speichern, anzeigen und löschen?

3. Es gibt in C int, double, char, struct, array - aber C kennt keine Listen, Stack und andere Datenstrukturen. C kennt auch keine Funktionen push() und pop() - ich muss selbst diese Funktionen schreiben. Deshalb sind für mich diese ganzen Datenstrukturen einfach Structs, die sich einbisschen von einander unterscheiden (z.B. haben einen Zeiger mehr etc). Wenn ich 10 Zeiger in eine Structur einbaue, die auf 10 weitere Elemente zeigen, dann habe ich damit meine neue eigene Datenstruktur erstellt, die ich dann Superliste nennen kann - egal ob sie Sinn ergibt oder nicht? Mir ist deshalb noch nicht klar, warum man diesen Datenstrukturen einen Namen gibt, wenn C sie nicht kennt und man diese selbst implementieren muss.

4. Ist es möglich diese Datenstrukturen Listen/Stack/Bäume/Queues miteinander zu vergleichen, um ihre Vor- und Nachteile aufzuschreiben, bzw. was sie können, was andere nicht können? (vielleicht werde ich diese Frage selbst beantworten können, wenn ich Frage 1, 2 und 3 verstanden habe)

5. Kann man die ganzen Vorgänge "schieben" und "zurückschieben" im Tutorial Stack grafisch darstellen? Und vielleicht noch gleich das Beispiel aus meiner Frage 2 einbauen. Das würde das Thema viel verständlicher machen.

Vielen Dank

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum Stack

Beitrag von Xin » Mi Jan 23, 2013 3:19 pm

forumnewbie hat geschrieben:Folgende Fragen habe ich noch:
1. Wenn die Aufgabe lautet: Elemente auf den Stack legen und vom Stack nehmen und anzeigen, ist damit der Programm-Stack gemeint?
Der Programmstack - wenn ich Dich richtig verstehe - verwaltet die Funktionsaufrufe. Du kannst Dir einen beliebigen Stack selbst erschaffen.
forumnewbie hat geschrieben:2. Ich kann leider den Stack von einer Liste nicht unterscheiden. Beides sind für mich Strukturen (Struct) mit einem Zeiger auf das nächste Element - auf die Speicherstelle im RAM/pStack?). Könnte jemand bitte ein SEHR einfaches Beispiel in C machen (ohne Schleifen oder if-Anweisungen) für eine Liste und einen Stack? Welche nur eine Angabe - Alter - speichern, anzeigen und löschen?
Ein Stack wird in der Regel nicht mit einem Zeiger auf das nächste Element realisiert. Das geht, weil man eine Liste auch als Stack benutzen kann.

Eine Liste ist eine Datenstruktur, bei der Du an beliebiger Stelle etwas hinzufügen oder entfernen kannst. Ein Stack ist ein Datenstruktur, wo Du (bitte) nur hinten anhängen und hinten wieder abnehmen darfst. Wenn Du einer Liste verbietest vorne oder mittig Elemente zu bearbeiten hast Du einen Stack, den Du mit einer Liste implementiert hast.

Ein Stack ist ein Stapel: Du packst oben ein Blatt drauf, dann packst Du noch ein Blatt drauf, und dann kommst Du an das darunter liegende Blatt erst dann wieder dran, wenn Du das oberste Blatt entfernt hast.
Eine Liste ist wie eine Schlange an der Kasse. Alle Elemente stehen hintereinander. Üblicherweise wird man vorne bedient und hinten stellt man sich an.Manchmal drängelt sich einer vor, manchmal lässt der eine den anderen vor und Elemente werden vertauscht. Dann wird eine weitere Kasse geöffnet und Elemente aus dieser Liste ordnen sich einer anderen Liste neu an. Das geht mit einem Stack nicht. Ein Stack ist ein enger Fahrstuhl, wo alle erst aussteigen müssen, damit der hinterste aus dem Fahrstuhl herauskommt.

Eine Implementation für einen Stack, der nicht auf einer Liste basiert kennst Du aus dem Wiki: struct:stack
forumnewbie hat geschrieben: 3. Es gibt in C int, double, char, struct, array - aber C kennt keine Listen, Stack und andere Datenstrukturen. C kennt auch keine Funktionen push() und pop() - ich muss selbst diese Funktionen schreiben. Deshalb sind für mich diese ganzen Datenstrukturen einfach Structs, die sich einbisschen von einander unterscheiden (z.B. haben einen Zeiger mehr etc). Wenn ich 10 Zeiger in eine Structur einbaue, die auf 10 weitere Elemente zeigen, dann habe ich damit meine neue eigene Datenstruktur erstellt, die ich dann Superliste nennen kann - egal ob sie Sinn ergibt oder nicht? Mir ist deshalb noch nicht klar, warum man diesen Datenstrukturen einen Namen gibt, wenn C sie nicht kennt und man diese selbst implementieren muss.
C ist eine Sprache. Es gibt Vokabeln und gewisse Regeln, wie man Sätze formuliert. Damit kannst Du alles beschreiben.
Damit sich Menschen unterhalten können, bekommen manche Konstrukte neue Namen, die in der Sprache selbst nicht eindeutig passen, aber jeder weiß, was gemeint ist. Man kann "Stapel" aufwendig umschreiben (und das muss man in C) oder einfach Stapel sagen. Obwohl Stapel als gramatikalisches Konstrukt in der Sprache nicht vorkommt, kann man sich aber darüber unterhalten, sobald "Stapel" erklärt wurde. Dafür kann man beispielsweise eine Erklärung bekannt geben. In C heißt das eben #include.

Du entscheidest, was C kann. C selbst erlaubt Dir alles zu beschreiben und beschränkt sich sprachlich auf ein absolutes Minimum, was aber eben recht. Wenn Du in C++ ankommst wirst Du einfach nur noch #include <stack> schreiben - oder eben #include <list>. Jeder benutzt "Stapel", aber für Dich ist es noch an der Zeit zu verstehen, was da eigentlich passiert, wenn man Stacks oder Listen verwendet.
forumnewbie hat geschrieben:4. Ist es möglich diese Datenstrukturen Listen/Stack/Bäume/Queues miteinander zu vergleichen, um ihre Vor- und Nachteile aufzuschreiben, bzw. was sie können, was andere nicht können? (vielleicht werde ich diese Frage selbst beantworten können, wenn ich Frage 1, 2 und 3 verstanden habe)
Klar, kann man machen. Aber es gibt nicht nur Listen, Stacks, Bäume, Queues, sondern noch seeeehr viele andere Datenstrukturen. Maps, Sets, Hashs, Arrays und schlussendlich ist ein Stack meistens mit einem Array implementiert. Als Entwickler mischt man sich die Datenstrukturen wie Legosteine so zurecht, dass man erhält, was man benötigt.
forumnewbie hat geschrieben:5. Kann man die ganzen Vorgänge "schieben" und "zurückschieben" im Tutorial Stack grafisch darstellen? Und vielleicht noch gleich das Beispiel aus meiner Frage 2 einbauen. Das würde das Thema viel verständlicher machen.
Das kann man sicherlich tun, doch das ist auch eine Zeitfrage. Eigentlich wollte ich gestern zwei, drei Stunden ans Wiki, aber dann passierte was anderes und schon war der Tag vorbei...

Du findest aber über den Link ins Wiki bereits entsprechend grafisch dargestellt, wie in einen Stack eingefügt und gelesen wird. Wichtig dabei ist, dass Du Dir einen Stack derzeit als Liste vorstellst, er aber meistens als Array realisiert wird - so wie im Wiki beschrieben. Arrays sind sehr primitive, aber schnelle Datenstrukturen, während Listen vergleichsweise langsam sind. Und ein Stack ist ein eher primitives Problem - perfekt für's Array.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Frage zum Stack

Beitrag von cloidnerux » Mi Jan 23, 2013 3:44 pm

Wenn die Aufgabe lautet: Elemente auf den Stack legen und vom Stack nehmen und anzeigen, ist damit der Programm-Stack gemeint?
Bitte unterscheiden: Ein Stack ist eine Konzept zum Verwalten von Daten, es ist eine theoretische Datenstruktur die dann in diversen Implementationen Anwendung findet. Der pStack wird einfach Stack genannt, weil es eben diesem Theorem entspricht, aber der Umkehrschluss existiert nicht, der pStack ist nicht jede Implementation eines Stacks.
ch kann leider den Stack von einer Liste nicht unterscheiden. Beides sind für mich Strukturen (Struct) mit einem Zeiger auf das nächste Element - auf die Speicherstelle im RAM/pStack?). Könnte jemand bitte ein SEHR einfaches Beispiel in C machen (ohne Schleifen oder if-Anweisungen) für eine Liste und einen Stack? Welche nur eine Angabe - Alter - speichern, anzeigen und löschen?
Hier bitte auch wieder die Trennung: Datenstrukturen sind immer erstmal Konzepte und sind immer auf Theoretischer Ebene zu betrachten.
Und damit unterscheiden sich Stacks und Listen.
Eine Liste ist ein quasi Array, alle Daten liegen hintereinender in einer beliebigen Reinfolge. Du kannst JEDES Element abfragen, verändern und Löschen, sowie neue Daten einfügen an jeder stelle. Das ist eine Liste.
Ein Stack ist ein Stapelspeicher. Du kannst NUR das oberste Element herunternehmen, bzw Auslesen oder ein neues oben drauf packen. Du kannst NICHT ein beliebiges Element abfragen, sondern musst erst alle Elemente über dem Element herunter nehmen.
Also Modell kann man sagen, eine Liste ist ein Aktenordner, wo jede Seite ein Datensatz ist. Wenn du weist wo eine Seite ist, kannst du darauf zugreifen, indem du einfach alle darüber liegenden Seiten rumklappst, du kannst die Seite ausheften, also Entfernen, du kannst sie Bearbeiten oder eine neue Seite einfügen, das entspricht einer Liste.
Ein Stack wäre ein Stapel aus diesen Papiern, außerhalb von einem Ordner. Du kannst nur das obere Blatt herunter nehmen, lesen und verändern oder ein neues oben drauf legen. Versuchst du aus dem Stapel ein Blatt herauszuziehen, wird dir der Stapel umkippen oder alles geht durcheinander. Das ist in etwa ein Stack.

Nun hast du eine Implementation eines Stacks in C gefunden. Hier muss nun diese Funktionalität nachgebildet werden, es wird also aus dem theoretischen Konzept ein praktisch nutzbare Datenstruktur.
Es gibt in C int, double, char, struct, array - aber C kennt keine Listen, Stack und andere Datenstrukturen. C kennt auch keine Funktionen push() und pop() - ich muss selbst diese Funktionen schreiben. Deshalb sind für mich diese ganzen Datenstrukturen einfach Structs, die sich einbisschen von einander unterscheiden (z.B. haben einen Zeiger mehr etc). Wenn ich 10 Zeiger in eine Structur einbaue, die auf 10 weitere Elemente zeigen, dann habe ich damit meine neue eigene Datenstruktur erstellt, die ich dann Superliste nennen kann - egal ob sie Sinn ergibt oder nicht? Mir ist deshalb noch nicht klar, warum man diesen Datenstrukturen einen Namen gibt, wenn C sie nicht kennt und man diese selbst implementieren muss.
C ist eine Programmiersprache, die sehr Hardwarenah ist. C beinhaltet nur ~30 Schlüsselwörter.
Alle Schlüsselwörter stellen nur das wesentliche dar, was dein Prozessor machen kann, bzw was notwendig ist, z.B Kontrollstrukturen. Es beinhaltet extra keine Funktionalität wie Listen oder Stacks(wir reden hier nicht über den pStack), weil der Prozessor das gar nicht kann. Und hier ist ein ganz deutlicher Punkt in der Programmierung: Alle Funktionalität und Datenstrukturen die außerhalb der Grundfunktionalität von C liegt ist auf eben diese Grundfunktionalität zurückgeführt.
Python oder C# können von Haus aus Listen und solche Datenstrukturen, aber das können sie nicht, weil es bessere Sprachen sind, sondern weil jemand schon für dich diese Funktionalität implementiert hat, auf Basis von dem was dein Prozessor kann.
Und genau deswegen sieht eine Implementation von einem Stack(nicht der pStack) so aus, wie in deinem Beispiel. Man verbindet mit Struct einige Variablen zu einem Konstrukt(Struktur), dass Informationen zu dem korrespondierenden Daten und dem nächsten Element enthält.
Es kann auch andere Implementationen geben.
Was du dir merken solltest, ist dass alle Diese Datenstrukturen nur eine Implementation eines theoretischem Konzepts sind, wovon sie auch ihren Namen haben.
Ist es möglich diese Datenstrukturen Listen/Stack/Bäume/Queues miteinander zu vergleichen, um ihre Vor- und Nachteile aufzuschreiben, bzw. was sie können, was andere nicht können? (vielleicht werde ich diese Frage selbst beantworten können, wenn ich Frage 1, 2 und 3 verstanden habe)
Ich hoffe du kannst sie dir nun Beantworten.

MfG cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum Stack

Beitrag von Xin » Mi Jan 23, 2013 3:54 pm

cloidnerux hat geschrieben:Eine Liste ist ein quasi Array, alle Daten liegen hintereinender in einer beliebigen Reinfolge.
Bitte statt Array "Container" lesen, also etwas was Elemente enthält/verwaltet.

Ich denke, ich weiß, was Du damit sagen willst, aber ein Array ist üblicherweise so definiert, dass die Elemente im Speicher hintereinander angeordnet sind und direkt beisammen liegen. Eine Liste ordnet Elemente über Zeiger, sie liegen nicht zwangsläufig im Speicher hintereinander.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Frage zum Stack

Beitrag von forumnewbie » Mi Jan 23, 2013 9:46 pm

Nochmal danke für die Hilfe! Das war jetzt zwar sehr viel Theorie, hilft mir aber enorm weiter beim Verständnis. Hätte ich gleich mit einer Programmiersprache angefangen, die bereits alle diese Sachen implementiert hat, würde ich vermutlich nicht verstehen wie das Ganze funktioniert. Aus diesem Grund ist es mir sehr wichtig zu verstehen was ich tue und nicht einfach Code auswendig lernen und anwenden. Dann komme ich mit Sicherheit an bestimmten Stellen nicht mehr weiter.

Ich weiß nicht, ob ich jetzt alles verstanden habe. Deshalb werde ich versuchen einige Aufgaben zu dem Stack und den Listen zu machen und melde mich bei Fragen oder Problemen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Frage zum Stack

Beitrag von Xin » Do Jan 24, 2013 10:08 am

forumnewbie hat geschrieben:Hätte ich gleich mit einer Programmiersprache angefangen, die bereits alle diese Sachen implementiert hat, würde ich vermutlich nicht verstehen wie das Ganze funktioniert.
Du kannst einen Stack auch in Java selbst implementieren. Aber es wird immer nur ein virtueller Stack sein. Implementiere das in C und Du wirst etwas haben, was genau so und nicht anders auf der Maschine läuft.

C++ vs. Java
forumnewbie hat geschrieben:Aus diesem Grund ist es mir sehr wichtig zu verstehen was ich tue und nicht einfach Code auswendig lernen und anwenden. Dann komme ich mit Sicherheit an bestimmten Stellen nicht mehr weiter.
Richtige Einstellung, wenn Du jemand werden möchtest, der für Fähigkeiten bezahlt werden möchte.
forumnewbie hat geschrieben:Ich weiß nicht, ob ich jetzt alles verstanden habe. Deshalb werde ich versuchen einige Aufgaben zu dem Stack und den Listen zu machen und melde mich bei Fragen oder Problemen.
Den Stack brauchst Du zunächst nur, um zu verstehen, dass jeder Funktionsaufruf etwas (die lokalen Variablen) auf den Stapel legt und am Ende von Return diese lokalen Variablen wieder vom Stack genommen werden. Dieses Konzept musst Du verinnerlichen und es wäre gut, wenn Du die Implementation nachvollziehen kannst, die Du bei uns unter c:stack findest. Das reicht - dann lerne weiter C.
Du musst die Implementierung des Stacks nicht perfekt auswendig können, Du sollst lernen, Probleme zu lösen und nicht auswendig gelerntes Wissen wieder zu geben.
Und wenn Du etwas brauchst, was man allgemein Stack nennt, dann löst Du das Problem und wirst eine sehr ähnliche Implementation schreiben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Frage zum Stack

Beitrag von cloidnerux » Do Jan 24, 2013 2:31 pm

Den Stack brauchst Du zunächst nur, um zu verstehen, dass jeder Funktionsaufruf etwas (die lokalen Variablen) auf den Stapel legt und am Ende von Return diese lokalen Variablen wieder vom Stack genommen werden. Dieses Konzept musst Du verinnerlichen und es wäre gut, wenn Du die Implementation nachvollziehen kannst, die Du bei uns unter c:stack findest. Das reicht - dann lerne weiter C.
Und auch du solltest die spezifizieren, ob du nen den Programm-Stack oder einen Stack im allgemeinen meinst, alles andere ist verwirrend.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten