C:Zeiger

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C:Zeiger

Beitrag von nufan » 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 :)

Iluya
Beiträge: 8
Registriert: So Mai 10, 2009 10:29 pm

Re: C:Zeiger

Beitrag von Iluya » Mo Mai 11, 2009 2:58 am

Hallo erstmal. (Erster Post :D)

Bin gerade dabei mich mit eurem Tutorial in C einzulesen und muss sagen, dass ihr bis jetzt einen echt tollen Job gemacht habt!

Zum Anlass:
Die Beispiele 5.1 und 5.2 sind nur durch die "5" miteinander verknüpft. Ich brauchte allerdings gute 5 Minuten, um überhaupt zu verstehen, dass ich den Code von 5.1 mitverwenden sollte. Ansonsten macht der Code von 5.2 ziemlich wenig Sinn und wäre fehlerhaft. Man achtet, wenn man auf das Lösen der Beispiele konzentriert ist, nunmal selten auf Strukturierung. :D Vorschlag: Neue Werte für 5.2 hinzufügen und es als 6 deklarieren, oder als zusätzliche Übung für "Laufzeitbeobachtungen" einfach den Code zusammenschreiben und nach der Speicherbelegung während des Codes fragen.

Eine Frage stellte sich nun im weiteren Lesen des Tutorials allerdings noch: Gibt es "Grauzonen", bzw. Syntaktische Freiheit um "*" zu verwenden?
-> Stellte sich vor allem in dem Codebeispiel für Stacks! Dort wurden Pointer sehr unterschiedlich definiert/angewendet:

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;
}
Fragen: (bzw. Meine Auffassung, die gerne korrigiert werden darf)
1: Dies hier ist wahrscheinlich eine "Zeigerfunktion", die einen Zeiger zurückgibt. Ist hier allerdings schon eine Typenbestimmung, des Zeigerinhalts vorgenommen worden?
2: " Stack * stack " erstellt einen Zeiger auf einen Stack?
3. " (Stack*) malloc( sizeof( Stack ) ); " castet den Mem-Bereich in einen typ Stack?

-> 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.
-> Casten, bzw. Typenumwandlungen habe ich überhaupt nicht auf der Übersicht gefunden!

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 ;)
Anwendungsfähig: [Delphi/FOP:Gut] | [HTML/JS/CSS: Mittel-Gut] | [PHP+MySQL: Gut] | [AutoIt(AHK): Gut];
Lernphase: [C:privat] | [C++:Uni];
Irgendwann geplant: [asm] | [Fortran];
There cannot be a crisis next week, my scedule is already full!

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

Re: C:Zeiger

Beitrag von Xin » Mo Mai 11, 2009 7:50 am

Iluya hat geschrieben:Hallo erstmal. (Erster Post :D)
Willkommen im Forum!

Ohne erstmal auf die Details einzugehen, weil ich jetzt erstmal zur Arbeit muss, so sei zumindest mal ein *thumbsup* dagebracht!
Genau solche Statements brauchen wir, um das Tutorial zu verbessern! Sehr gut.
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!
Dafür erstmal vielen Dank, aber wie Du gesehen hast, sind wir noch nicht ganz fertig.

Darf ich fragen, wie Du das Tutorial gefunden hast?
Iluya hat geschrieben:Eine Frage stellte sich nun im weiteren Lesen des Tutorials allerdings noch: Gibt es "Grauzonen", bzw. Syntaktische Freiheit um "*" zu verwenden?
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.

-> Stellte sich vor allem in dem Codebeispiel für Stacks! Dort wurden Pointer sehr unterschiedlich definiert/angewendet:

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;
}
Fragen: (bzw. Meine Auffassung, die gerne korrigiert werden darf)
1: Dies hier ist wahrscheinlich eine "Zeigerfunktion", die einen Zeiger zurückgibt. Ist hier allerdings schon eine Typenbestimmung, des Zeigerinhalts vorgenommen worden?[/quote]
Da wird tatsächlich eine Adresse zurückgegeben, die auf einen Datensatz vom Typ "Stack" zeigt.
Iluya hat geschrieben:2: " Stack * stack " erstellt einen Zeiger auf einen 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:3. " (Stack*) malloc( sizeof( Stack ) ); " castet den Mem-Bereich in einen typ 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:-> 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.
Leerzeichen spielen in dem Fall keine Rolle - wenn ich die Frage richtig verstanden habe.
Iluya hat geschrieben:-> Casten, bzw. Typenumwandlungen habe ich überhaupt nicht auf der Übersicht gefunden!
Joah, da könnten wir was dran ändern.
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 ;)
Vielen Dank für Deine Anregungen, sie werden sicherlich in Kürze Verbesserungen im Wiki auslösen.
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.

Iluya
Beiträge: 8
Registriert: So Mai 10, 2009 10:29 pm

Re: C:Zeiger

Beitrag von Iluya » Mo Mai 11, 2009 12:42 pm

Xin hat geschrieben: Darf ich fragen, wie Du das Tutorial gefunden hast?
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.
Der Link auf diese Seite war denke ich aus dem Gulli Board im gepinnten "Ich will Programmieren lernen, was muss ich machen".
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.
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: 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.
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:
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.
Leerzeichen spielen in dem Fall keine Rolle - wenn ich die Frage richtig verstanden habe.
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.

MfG Iluya
Anwendungsfähig: [Delphi/FOP:Gut] | [HTML/JS/CSS: Mittel-Gut] | [PHP+MySQL: Gut] | [AutoIt(AHK): Gut];
Lernphase: [C:privat] | [C++:Uni];
Irgendwann geplant: [asm] | [Fortran];
There cannot be a crisis next week, my scedule is already full!

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

Re: C:Zeiger

Beitrag von Xin » Mo Mai 11, 2009 12:53 pm

Iluya 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.
Assembler gleich noch dazu...? Okay... pack Deine Erfahrungen in ein Assembler-Tutorial ;)
Sowas haben wir nämlich noch nicht. ^^
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.
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:
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.
Gerade dies ist anscheinend eine sehr häufige Anwendung... Warum nicht als Beispiel für Pointer angeben.
Was als Beispiel für Pointer angeben? Einen Stack?
Jemand, der den Artikel über die Pointer liest, ist mit einem Stack noch leicht überfordert, würde ich sagen.
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.
Naja, eben "Stack Pointer" => Pointer auf einen Stack.
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.
Dann muss da wohl ein Satz rein, der klarstellt, dass die Leerzeichen hier alle keine Rolle spielen und alles die gleiche Bedeutung hat.
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
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C:Zeiger

Beitrag von Dirty Oerti » Mo Mai 11, 2009 1:06 pm

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.
Wird das beste sein. (Ist der Satz schon drinn?)
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.
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? :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Iluya
Beiträge: 8
Registriert: So Mai 10, 2009 10:29 pm

Re: C:Zeiger

Beitrag von Iluya » Mo Mai 11, 2009 2:31 pm

Xin hat geschrieben: Assembler gleich noch dazu...? Okay... pack Deine Erfahrungen in ein Assembler-Tutorial ;)
Sowas haben wir nämlich noch nicht. ^^
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:
Iluya hat geschrieben:
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.
Gerade dies ist anscheinend eine sehr häufige Anwendung... Warum nicht als Beispiel für Pointer angeben.
Was als Beispiel für Pointer angeben? Einen Stack?
Jemand, der den Artikel über die Pointer liest, ist mit einem Stack noch leicht überfordert, würde ich sagen.
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.
-> Auch hier sollte vielleicht vorher die Typenumwandlung behandelt worden sein.
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?
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. :)

MfG
Anwendungsfähig: [Delphi/FOP:Gut] | [HTML/JS/CSS: Mittel-Gut] | [PHP+MySQL: Gut] | [AutoIt(AHK): Gut];
Lernphase: [C:privat] | [C++:Uni];
Irgendwann geplant: [asm] | [Fortran];
There cannot be a crisis next week, my scedule is already full!

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

Re: C:Zeiger

Beitrag von Xin » Mo Mai 11, 2009 3:09 pm

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.
Zu den Bäumen komme ich grade überhaupt nicht, zumal es ja eine ganze Reihe von Bäumen gibt...
Ich habe nichts dagegen, im Gegenteil: proggen.org ist ein Mitmachprojekt. Und bei Fragen kann ich die sicherlich hier beantworten, bzw. wir machen die Seiten zusammen.
Iluya hat geschrieben:
Xin hat geschrieben:Jemand, der den Artikel über die Pointer liest, ist mit einem Stack noch leicht überfordert, würde ich sagen.
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.
-> Auch hier sollte vielleicht vorher die Typenumwandlung behandelt worden sein.
Sehe ich noch nicht so... wenn man noch nicht weiß, was Zeiger sind, braucht man auch noch nicht zu wissen, was Casting ist.
Als guter Programmierer benutzt man so oder so kein Casting.
Dirty Oerti hat geschrieben:
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.
Wird das beste sein. (Ist der Satz schon drinn?)
Ä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.
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.

Antworten