the new technican Geschrieben 13. April 2002 Geschrieben 13. April 2002 Hallo, ich bin im 1.AJ und lerne wie so viele, C++ in der schule. nun ich bin jemand der eigentlich sehr gut mitkommt aber kann mir mal wer eine gute Aufgabenstellung sagen und mir an dieser verdeutlichen welche Vorteile Pointer (Zeiger) haben. Das muss jetzt nichts riesig großes sein. Eben nur was was mir das zeigt. Ev. könnte das ja dann auch jemand korrigieren ;).Der Grund wieso ich da was will ist weil wir nur in der Schule ein Bsp gemacht haben. Das war: Machen sie eine Funktion die die Diskriminante berechnet und benutzen sie eine Pointer. Das war natürlich ausführlich aber man hätte eben diese Aufgabe auch leichter kösen können wenn ich die Variable wieder rückübergeben hätte. So wie bisher eben... Aber bitte auch nur lösbares!!! *G* :OD Fänd ich echt super!!! Zitieren
Orffi Geschrieben 14. April 2002 Geschrieben 14. April 2002 Bitte poste mal ein Minimum von Code zu dem Beispiel. Ich weiß nicht, wo genau Dein Problem liegt. Es wäre schön, wenn man Dein Beispiel hätte und es daran erklären könnte. Dann lassen sich auch besser Aufgaben zu Deinem speziellen Problem finden. Jan Zitieren
the new technican Geschrieben 14. April 2002 Autor Geschrieben 14. April 2002 Ich habe nicht unbedingt ein Problem mit Pointer nur will ich es noch zwei Kumpels erklären... aber eben an einem bessern / anderen Bsp als in der Schule. Als einer von euch das gelernt hat muss er doch auch ein Beispiel gehabt haben nur will ich eben im mom nur die Aufgabenstellung!!! Zitieren
nic_power Geschrieben 14. April 2002 Geschrieben 14. April 2002 Na, mit einem Beispiel wird Du da aber nicht weit kommen. Pointer koennen ziemlich komplex werden. Ein immer wieder gern genommenes Beispiel fuer Pointer ist quicksort: "Schreiben Sie eine Sortierroutine, die mit beliebigen Elementen umgehen kann": void qsort(void *base, size_t num_elements, size_t element_size, int (*compare)(void const *, void const *)); Nic Zitieren
Orffi Geschrieben 14. April 2002 Geschrieben 14. April 2002 nic_power hat schon recht: mit einem Beispiel wirst Du da nicht weit kommen. Ehrlich gesagt versuche ich auch immer noch dahinter zu kommen, was Du nun genau suchst. Beispiele/Aufgabenstellungen in denen statt "call by value" "call by reference" benutzt wird. Beispiele, bei denen man nur mit Zeigern zum Ziel kommt oder Beispiele die speziell auf Speicheranforderung zur Laufzeit abzielen. Jan Zitieren
Crush Geschrieben 14. April 2002 Geschrieben 14. April 2002 Bei einem Zeiger, der auch nur eine Referenz ist, wird halt unnötiges Kopieren vermieden und immer mit dem selben Objekt gearbeitet. Der Hauptsinn ist dabei, daß von einer Variable keine Kopien angelegt werden - also "real" selben Daten bearbeitet werden - und Bearbeitungsvorgänge schneller ablaufen - sonst nix weiter. Das "Zurückreichen" von Werten verursacht auch unnötige Kopiervorgänge und erhöhte Stack-Belastung (außer in Ausnahmefällen bei Fastcalls und inline-Funktionen). Eine Faustregel besagt jedenfalls, daß man bei mehr als 2 Parametern (vor allem wenn das keine Standard-Datentypen sind) bei Funktionen lieber Referenzen, bzw. Zeiger überreichen soll (gerade wegen den Fastcalls, weil die Parameter dann in Prozessor-Registern der Funktion überreicht werden können ohne unnötig den Stack zu belasten). Referenzen merke ich mir immer als konstante Zeiger ... das haben wir mal ausdiskutiert gehabt - auch wenn´s nach der Theorie nicht so sein soll - praktisch wurde das so von den Compilerbauern gelöst. Gleich mit Funktionszeigern loszulegen ist ein schlechtes Beispiel, weil hier eine andere Absicht dahinterliegt. Es sollen Daten in diesem Fall ohne genaueres Wissen über das Sortierkriterium selbst von einer Standard-Funktion sortiert werden. Dieses liegt eben im Funktionszeiger "versteckt". Ein Wechseln des Funktionszeigers ermöglicht es also der Funktion andere Kriterien festzulegen. Das hat ja mit der Stackbelastung durch Datenkopiererei recht wenig zu tun (hier wird ja auch nur ein Bool als Kriterium für tauschen oder nicht tauschen herangezogen). Es geht hier also in der ersten Linie um Prinzipien bezüglich des Laufzeitverhaltens. Zitieren
nic_power Geschrieben 14. April 2002 Geschrieben 14. April 2002 Original geschrieben von Crush Gleich mit Funktionszeigern loszulegen ist ein schlechtes Beispiel, weil hier eine andere Absicht dahinterliegt. Es sollen Daten in diesem Fall ohne genaueres Wissen über das Sortierkriterium selbst von einer Standard-Funktion sortiert werden. Dieses liegt eben im Funktionszeiger "versteckt". Ein Wechseln des Funktionszeigers ermöglicht es also der Funktion andere Kriterien festzulegen. Das hat ja mit der Stackbelastung durch Datenkopiererei recht wenig zu tun (hier wird ja auch nur ein Bool als Kriterium für tauschen oder nicht tauschen herangezogen). Es geht hier also in der ersten Linie um Prinzipien bezüglich des Laufzeitverhaltens. Ich hatte das Beispiel absichtlich so gewählt, um drauf hinzuweisen, daß es mit einem einzigen nicht getan ist. Nic Zitieren
nic_power Geschrieben 14. April 2002 Geschrieben 14. April 2002 Kleiner Nachtrag: Original geschrieben von Crush Referenzen merke ich mir immer als konstante Zeiger ... das haben wir mal ausdiskutiert gehabt - auch wenn´s nach der Theorie nicht so sein soll - praktisch wurde das so von den Compilerbauern gelöst. Bei solchen Fragen empfiehlt sich immer ein Blick in die dazugehoerige FAQ: http://www.inf.uni-konstanz.de/~kuehl/cpp/cppfaq.htm/references.html Nic Zitieren
Crush Geschrieben 15. April 2002 Geschrieben 15. April 2002 "Important note: Even though a reference is often implemented using an address in the underlying assembly language, please do not think of a reference as a funny looking pointer to an object. A reference is the object. It is not a pointer to the object, nor a copy of the object. It is the object." Hab´ ich doch gesagt: Theoretisch soll man es als das Objekt selbst verstehen - aber der Compiler macht nix anderes als einen initialisierten konstanten Zeiger zu verwenden, genauso wie beim normalen Zeiger, der halt auch das Objekt selbst benutzt - es werden lediglich der Zugriff auf diesen Zeiger und die Dereferenzierung versteckt. Fazit: Theorie & Praxis sind halt 2 verschiedene Dinge - aber es macht auch eigentlich keinen Unterschied, wie man etwas versteht, sondern wann man was einsetzt - und warum. Zitieren
nic_power Geschrieben 15. April 2002 Geschrieben 15. April 2002 Hallo, Entscheidend ist die Bemerkung "please do not think of a reference as a funny looking pointer to an object." Wie die Implementierung durch den Compilerbauer aussieht ist eigentlich unerheblich, da dies implementierungsabhaengig ist. Im Normallfall wird dies zwar ueber einen Pointer realisiert - wie Du oben schon angemerkt hast - es sind aber auch andere Loesungen denkbar. Nic Zitieren
Scav Geschrieben 15. April 2002 Geschrieben 15. April 2002 Aufgabe: Schreibe ein Programm, welches von 10 Mitarbeitern den Namen, die gefahrenen Kilometer und das ausgegebene Geld einliest. Anschließend soll es für jeden Mitarbeiter den durchschnittlichen Literpreis augeben und einen Gesamtdurchschnitt berechnen. Schreibe Eingabe, Berechnung und Ausgabe in getrennten Funktionen! Daür wirst du Pointer brauchen! (korrigiert mich wenn ich spinne:D) Zitieren
maddin Geschrieben 15. April 2002 Geschrieben 15. April 2002 @scav: bei deiner aufgabe braucht man nicht unbeding zeiger. man kann auch einfach sämtliche variablen global deklarieren. da das keiner macht eine schöne aufgabe. meine aufgabe: schreibe eine einfach/ doppelt verkettete liste, die int zahlen speichern kann. dabei soll immer nur soviel speicher reserviert werden wie wirklich nötig. nicht unbedingt etwas bei dem man zeiger bei der übergabe braucht, hilft aber beim verstehen von zeigern. Zitieren
nic_power Geschrieben 15. April 2002 Geschrieben 15. April 2002 Original geschrieben von maddin @scav: bei deiner aufgabe braucht man nicht unbeding zeiger. man kann auch einfach sämtliche variablen global deklarieren. da das keiner macht eine schöne aufgabe. meine aufgabe: schreibe eine einfach/ doppelt verkettete liste, die int zahlen speichern kann. dabei soll immer nur soviel speicher reserviert werden wie wirklich nötig. nicht unbedingt etwas bei dem man zeiger bei der übergabe braucht, hilft aber beim verstehen von zeigern. Praktisch jedes Problem laesst sich auch mit globalen Variablen loesen, man sollte dies jedoch immer vermeiden und nur dann globale Variable verwenden, wenn es unumgaenglich ist (errno z.b.). Nic Zitieren
Crush Geschrieben 15. April 2002 Geschrieben 15. April 2002 Erstelle eine Tabelle (Tab1) mit Zufallszahlen und sortiere die Inhalte nicht direkt, sondern mit einer Hilfstabelle (Tab2) (wo die Zeiger auf die Tabelleninhalte von Tab1 rein müssen). Der Inhalt von Tabelle 1 muß also in der Orginalform erhalten bleiben und es dürfen von den Inhalten keine Kopien angelegt werden. Den Spaß könnte man dann noch weitertreiben mit weiteren Hilfstabellen, die absteigend sortiert sind oder von mir aus nach den Bits 6-12 sortieren oder auch sonstwas - hauptsache es werden von Tabelle1 keine Inhalte kopiert. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.