Re: C:Zeiger
Verfasst: Fr Sep 19, 2008 2:09 pm
So, ich hab jetzt die Lösungen zu den Beispielen reingeschrieben. Wenn sie schlecht formuliert oder gar falsch sind, zögert nicht mich zu korriegieren
Code: Alles auswählen
Stack * CreateStack( unsigned int maxSize ) // Hier soll die Adresse zurückgegeben werden... s.Frage 1
{
if( maxSize <= 0 )
return 0;
Stack * stack = (Stack*) malloc( sizeof( Stack ) ); //s. Frage 2 und 3
stack->maxSize = maxSize;
stack->size = 0;
stack->esp = (unsigned int *) malloc( maxSize );
return stack;
}
Willkommen im Forum!Iluya hat geschrieben:Hallo erstmal. (Erster Post )
Dafür erstmal vielen Dank, aber wie Du gesehen hast, sind wir noch nicht ganz fertig.Iluya hat geschrieben:Bin gerade dabei mich mit eurem Tutorial in C einzulesen und muss sagen, dass ihr bis jetzt einen echt tollen Job gemacht habt!
Grauzonen sollte es eigentlich nicht geben. Hier müssen wir rausfinden, wo die Grauzone herkommt und das Tutorial so abändern, dass es deine Fragen direkt mitbeantwortet, so dass sie bei anderen Einsteigern gar nicht erst aufkommt.Iluya hat geschrieben:Eine Frage stellte sich nun im weiteren Lesen des Tutorials allerdings noch: Gibt es "Grauzonen", bzw. Syntaktische Freiheit um "*" zu verwenden?
Code: Alles auswählen
Stack * CreateStack( unsigned int maxSize ) // Hier soll die Adresse zurückgegeben werden... s.Frage 1
{
if( maxSize <= 0 )
return 0;
Stack * stack = (Stack*) malloc( sizeof( Stack ) ); //s. Frage 2 und 3
stack->maxSize = maxSize;
stack->size = 0;
stack->esp = (unsigned int *) malloc( maxSize );
return stack;
}
Ja... vobei hier zwei Stacks gemeint sind... "Stack * stack" erzeugt eine Variable vom Typ eines Zeigers auf ein selbstprogrammierten "Stack"-Objekt auf dem Laufzeit-Stack der Programmiersprache. Der Laufzeit Stack und der selbstprogrammierte Stack haben dabei nichts miteinander zu tun. "Window * w" würde einen Zeiger auf ein "Window" auf dem Laufzeit-Stack ablegen.Iluya hat geschrieben:2: " Stack * stack " erstellt einen Zeiger auf einen Stack?
Richtig. Da es bisher ein reines C-Tutorial ist, wird der Speicher mit malloc angefordert. Malloc liefert allerdings einen Zeiger auf void (Zeiger auf irgendwas) zurück und damit man irgendwas auf einer Variablen vom Typ "Stack*" speichern kann, muss man dem Compiler mit "(Stack*)" mitteilen, dass das so passt.Iluya hat geschrieben:3. " (Stack*) malloc( sizeof( Stack ) ); " castet den Mem-Bereich in einen typ Stack?
Leerzeichen spielen in dem Fall keine Rolle - wenn ich die Frage richtig verstanden habe.Iluya hat geschrieben:-> Das Problem ist, das hier auf einmal Dereferenzierungsoperatoren mit umgebenden Leerzeichen dargestellt werden, bzw. gar hinter Variablen auftauchen, während in c:pointer nur vorangestellte (ohne Leerzeichen) Deref-Op. waren.
Joah, da könnten wir was dran ändern.Iluya hat geschrieben:-> Casten, bzw. Typenumwandlungen habe ich überhaupt nicht auf der Übersicht gefunden!
Vielen Dank für Deine Anregungen, sie werden sicherlich in Kürze Verbesserungen im Wiki auslösen.Iluya hat geschrieben:Das Beispiel sollte definitiv bleiben, aber hier werden für mich, als C-Neuling eindeutig zuviele Sachen unerklärt gelassen. Das System dahinter ist trotzdem gut verständlich!
Laut ToDo soll diese Seite sowieso noch überarbeitet werden, aber da das Hauptproblem die Pointerverwendung war hab ichs mal hierhin gepostet, weil evtl diese Art der Anwendung noch beschrieben werden sollte.
PS.: Jetzt ist es doch so spät geworden... Immerhin ein gutes Zeichen, dass das Tutorial gut gemacht ist
Hatte mich in diversen Foren durch Programmier-Anfängertipps gelesen, um zu sehen in welchem Bereich ich als nächstes meine Wissenslücken schließen sollte. Dabei ist mir aufgefallen, dass ich bis jetzt wenig Möglichkeiten habe "LowLevel" zu programmieren, bzw. das nicht ohne größeren Aufwand mit Delphi bzw. Free Object Pascal machen kann. Deswegen wollte ich nun C in Verbindung mit asm lernen und verstehen.Xin hat geschrieben: Darf ich fragen, wie Du das Tutorial gefunden hast?
Viele Probleme kommen auf, wenn man als unsicherer Anfänger auf unterschiedliche Schreibstile trifft. Das verwirrt vorerst nur unnötig und wirft Fragen auf. Natürlich sollte in späteren Kapiteln auch explizit auf unterschiedliche Stile und Möglichkeiten bei der Programmierung hingewiesen werden (man liest ja hinterher auch mal Code von anderen), nur es behindert beim ersten Verständnis.Xin hat geschrieben: Grauzonen sollte es eigentlich nicht geben. Hier müssen wir rausfinden, wo die Grauzone herkommt und das Tutorial so abändern, dass es deine Fragen direkt mitbeantwortet, so dass sie bei anderen Einsteigern gar nicht erst aufkommt.
Gerade dies ist anscheinend eine sehr häufige Anwendung... Warum nicht als Beispiel für Pointer angeben. In c:pointer ist immer von der Definition als <typ> *<varname> (=<predef val>) die Rede. wobei * immer direkt an den Pointer schließt. -> Ist auch logischer. Aber wenn es dann (Stack*) heißt... Kann man damit nichts anfangen.Xin hat geschrieben: Ja... vobei hier zwei Stacks gemeint sind... "Stack * stack" erzeugt eine Variable vom Typ eines Zeigers auf ein selbstprogrammierten "Stack"-Objekt auf dem Laufzeit-Stack der Programmiersprache. Der Laufzeit Stack und der selbstprogrammierte Stack haben dabei nichts miteinander zu tun. "Window * w" würde einen Zeiger auf ein "Window" auf dem Laufzeit-Stack ablegen.
Ich benutz mal "_" für Leerzeichen, damit es deutlicher wir:Xin hat geschrieben:Leerzeichen spielen in dem Fall keine Rolle - wenn ich die Frage richtig verstanden habe.Iluya hat geschrieben:-> Das Problem ist, das hier auf einmal Dereferenzierungsoperatoren mit umgebenden Leerzeichen dargestellt werden, bzw. gar hinter Variablen auftauchen, während in c:pointer nur vorangestellte (ohne Leerzeichen) Deref-Op. waren.
Assembler gleich noch dazu...? Okay... pack Deine Erfahrungen in ein Assembler-TutorialIluya hat geschrieben:Hatte mich in diversen Foren durch Programmier-Anfängertipps gelesen, um zu sehen in welchem Bereich ich als nächstes meine Wissenslücken schließen sollte. Dabei ist mir aufgefallen, dass ich bis jetzt wenig Möglichkeiten habe "LowLevel" zu programmieren, bzw. das nicht ohne größeren Aufwand mit Delphi bzw. Free Object Pascal machen kann. Deswegen wollte ich nun C in Verbindung mit asm lernen und verstehen.
Hmm... schwierig, ich schätze bei den Leerzeichen lässt sich schwer ein konsistenter Schreibstil festlegen. Ich vermute, den nichtmals in meinen eigenen Programmen anzutreffen.Iluya hat geschrieben:Viele Probleme kommen auf, wenn man als unsicherer Anfänger auf unterschiedliche Schreibstile trifft. Das verwirrt vorerst nur unnötig und wirft Fragen auf. Natürlich sollte in späteren Kapiteln auch explizit auf unterschiedliche Stile und Möglichkeiten bei der Programmierung hingewiesen werden (man liest ja hinterher auch mal Code von anderen), nur es behindert beim ersten Verständnis.
Was als Beispiel für Pointer angeben? Einen Stack?Iluya hat geschrieben:Gerade dies ist anscheinend eine sehr häufige Anwendung... Warum nicht als Beispiel für Pointer angeben.Xin hat geschrieben:Ja... vobei hier zwei Stacks gemeint sind... "Stack * stack" erzeugt eine Variable vom Typ eines Zeigers auf ein selbstprogrammierten "Stack"-Objekt auf dem Laufzeit-Stack der Programmiersprache. Der Laufzeit Stack und der selbstprogrammierte Stack haben dabei nichts miteinander zu tun. "Window * w" würde einen Zeiger auf ein "Window" auf dem Laufzeit-Stack ablegen.
Naja, eben "Stack Pointer" => Pointer auf einen Stack.Iluya hat geschrieben:In c:pointer ist immer von der Definition als <typ> *<varname> (=<predef val>) die Rede. wobei * immer direkt an den Pointer schließt. -> Ist auch logischer. Aber wenn es dann (Stack*) heißt... Kann man damit nichts anfangen.
Dann muss da wohl ein Satz rein, der klarstellt, dass die Leerzeichen hier alle keine Rolle spielen und alles die gleiche Bedeutung hat.Iluya hat geschrieben:Ich benutz mal "_" für Leerzeichen, damit es deutlicher wir:
Im c:pointer werden nur <typ>_*<varname> (=<predef val>) definiert.
<typ>_*_<varname> wirft Fragen auf.
(<typ>*) auch.
Wird das beste sein. (Ist der Satz schon drinn?)Xin hat geschrieben:Dann muss da wohl ein Satz rein, der klarstellt, dass die Leerzeichen hier alle keine Rolle spielen und alles die gleiche Bedeutung hat.
Vielleicht sollten wir mal das ganze Wiki durchgehen und die Schreibstile (in den Codebeispielen) anpassen.Iluya hat geschrieben:Viele Probleme kommen auf, wenn man als unsicherer Anfänger auf unterschiedliche Schreibstile trifft. Das verwirrt vorerst nur unnötig und wirft Fragen auf. Natürlich sollte in späteren Kapiteln auch explizit auf unterschiedliche Stile und Möglichkeiten bei der Programmierung hingewiesen werden (man liest ja hinterher auch mal Code von anderen), nur es behindert beim ersten Verständnis.
Naja...sind eher die langgesteckten Ziele. Kann auch sein, das ich nach C erstmal noch die C++ Dinge angehe, wobei ich ja in der Hinsicht wenig Probleme sehe, da das Wissen hinter OOP durch Delphi schon zum größten Teil vorhanden ist. Ich könnte allerdings helfe das C-Tut zu erweitern, indem ich erklärende Text zu z.B. Bäumen mache und dann jemand die spezielle C-Umsetzung/Besonderheiten dazuschreibt. Wäre eine Win-Win Situation: Ich lern den C-Teil und ihr habt weniger Arbeit.Xin hat geschrieben: Assembler gleich noch dazu...? Okay... pack Deine Erfahrungen in ein Assembler-Tutorial
Sowas haben wir nämlich noch nicht. ^^
Ich meinte eher die Anwendung in etwas komplexeren Zusammenhängen: <Typ> * <Varname> = 4432 -> Übergibt die Adresse 4432 in <varname>, wobei dort ein Wert von <Typ> gespeichert ist.Xin hat geschrieben:Was als Beispiel für Pointer angeben? Einen Stack?Iluya hat geschrieben:Gerade dies ist anscheinend eine sehr häufige Anwendung... Warum nicht als Beispiel für Pointer angeben.Xin hat geschrieben:Ja... vobei hier zwei Stacks gemeint sind... "Stack * stack" erzeugt eine Variable vom Typ eines Zeigers auf ein selbstprogrammierten "Stack"-Objekt auf dem Laufzeit-Stack der Programmiersprache. Der Laufzeit Stack und der selbstprogrammierte Stack haben dabei nichts miteinander zu tun. "Window * w" würde einen Zeiger auf ein "Window" auf dem Laufzeit-Stack ablegen.
Jemand, der den Artikel über die Pointer liest, ist mit einem Stack noch leicht überfordert, würde ich sagen.
So etwas in der Art. Wahrscheinlich reicht es nach dem Ersten Durchgang sich an den bisherigen Beispielen zu orientieren. Andererseits würde ich die Priorität nicht zwingend darauf setzen: Solche Sachen regen nämlich auch das Nachdenken über den QT an.Dirty Oerti hat geschrieben:Vielleicht sollten wir mal das ganze Wiki durchgehen und die Schreibstile (in den Codebeispielen) anpassen.
Wenn wir das so alle 3 Monate oder so mal machen, sollten wir doch einen recht einheitlichen Stil hinbekommen, oder?
Zu den Bäumen komme ich grade überhaupt nicht, zumal es ja eine ganze Reihe von Bäumen gibt...Iluya hat geschrieben:Ich könnte allerdings helfe das C-Tut zu erweitern, indem ich erklärende Text zu z.B. Bäumen mache und dann jemand die spezielle C-Umsetzung/Besonderheiten dazuschreibt. Wäre eine Win-Win Situation: Ich lern den C-Teil und ihr habt weniger Arbeit.
Sehe ich noch nicht so... wenn man noch nicht weiß, was Zeiger sind, braucht man auch noch nicht zu wissen, was Casting ist.Iluya hat geschrieben:Ich meinte eher die Anwendung in etwas komplexeren Zusammenhängen: <Typ> * <Varname> = 4432 -> Übergibt die Adresse 4432 in <varname>, wobei dort ein Wert von <Typ> gespeichert ist.Xin hat geschrieben:Jemand, der den Artikel über die Pointer liest, ist mit einem Stack noch leicht überfordert, würde ich sagen.
-> Auch hier sollte vielleicht vorher die Typenumwandlung behandelt worden sein.
Ähh... auf die Uhr guck... nein, ist noch ein ungünstiger Zeitpunkt, um viel Zeit in Bereichen von proggen.org zu verbringen, die nichts mit meiner derzeitigen Arbeit zu tun haben.Dirty Oerti hat geschrieben:Wird das beste sein. (Ist der Satz schon drinn?)Xin hat geschrieben:Dann muss da wohl ein Satz rein, der klarstellt, dass die Leerzeichen hier alle keine Rolle spielen und alles die gleiche Bedeutung hat.