Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Pointer und "^" (https://www.delphipraxis.net/150218-pointer-und-%5E.html)

Daniela.S 10. Apr 2010 13:48


Pointer und "^"
 
Hallo,

ich hab mal eine Frage bezüglich Pointer. Tut nichts zur Funktion ist auch kein Problem, es geht mir nur um die Schreibweise.

Aus irgendeinem - mir nicht mehr bekannten - Grund hab ich mir angewöhnt beim Zugriff auf ein Objekt mittels Pointer ein "^" Zeichen zu verwenden. Zum Beispiel:

Delphi-Quellcode:
type
  PTreeItem = ^TTreeItem;
  TTreeItem = record
     Text  : String;
     Index : Integer;
  end;

procedure irgendwas;
var
  pItem    : PTreeItem;
begin
  New( pItem );
  pItem^.Text := 'Hallo Welt';
  pItem^.Index := 1;

  ...

  Dispose( pItem );
end;
Das jetzt nur mal so als Beispiel, ohne Sinnhaftigkeit.

Eigentlich ist es ja gar nicht notwendig. Für mich erleichtert es zwar die Lesbarkeit, weil ich dann weiss dass es sich um einen Pointer handelt. Obwohl ich da auch immer die Variable mit einem p beginne. Aber ich frage mich warum ich mir das angewöhnt habe? Kommt das vielleicht gar noch aus TurbaPascal Zeiten? :gruebel:

Sollte man sich das abgewöhnen?


liebe Grüße,
Daniela

dominikkv 10. Apr 2010 13:51

Re: Pointer und "^"
 
Solange du dich damit wohlfühlst würde ich nicht darüber nachdenken, ob mal sollte oder nicht.

PS: ich mach das auch immer mit ^, da man so besser sieht, dass es sich um einen Pointer handelt.

Namenloser 10. Apr 2010 13:55

Re: Pointer und "^"
 
Ich schreibe solche Anweisungen auch immer mit ^, alles andere ist meiner Meinung nach semantisch usninnig und nur für Leute, die zu faul sind, ein zusätzliches Zeichen zu tippen.

mkinzler 10. Apr 2010 13:58

Re: Pointer und "^"
 
Das ist eigentlich auch richtig so. Der Delphicompiler "ergänzt" dies zawr wenn es fehlt, so dass es nicht unbedingt notwendig ist.

mirage228 10. Apr 2010 14:21

Re: Pointer und "^"
 
Zitat:

Zitat von NamenLozer
[...] für Leute, die zu faul sind, ein zusätzliches Zeichen zu tippen.

Hm, ich lasse das Dach eigentlich auch immer weg... :duck:

:mrgreen:

BUG 10. Apr 2010 14:24

Re: Pointer und "^"
 
Freepascal (-> Lazarus) nimmt das genauer (wenn nicht im Delphi-Modus).
Somit ist dein Code sogar portabler.


Wenn du es mal begründen sollst :stupid:

Corpsman 10. Apr 2010 14:36

Re: Pointer und "^"
 
Also ich finde die Verwendung des ^ ebenfalls gut. Weil man die Dereferenzierung wirklich sieht.

Und als Umsteiger von Delphi nach Freepascal ( Lazarus ) bin ich nun Froh dass ich sie gesetzt habe.

FPC Verlangt auch das @ bei der Zuweisung von Notify Events. Delphi will die so viel ich weis glaube ich nicht haben...

mkinzler 10. Apr 2010 14:38

Re: Pointer und "^"
 
Wie gesagt, nur weil der Compiler gutmütiger Weise etwas nicht ganz korrekten Code akzeptiert, heisst das noch lange nicht dass er richtig bzw. das korrekter Code falsch ist. Das ^ ist also nicht überflüssig

Namenloser 10. Apr 2010 14:44

Re: Pointer und "^"
 
Zitat:

Zitat von mirage228
Zitat:

Zitat von NamenLozer
[...] für Leute, die zu faul sind, ein zusätzliches Zeichen zu tippen.

Hm, ich lasse das Dach eigentlich auch immer weg... :duck:

:mrgreen:

Du faules Stück :warn:
Zitat:

Zitat von Corpsman
FPC Verlangt auch das @ bei der Zuweisung von Notify Events. Delphi will die so viel ich weis glaube ich nicht haben...

Wobei man darüber natürlich diskutieren kann. Ich persönlich finde die Schreibweise ohne @ logisch, weil für mich die Funktion bereits die Adresse ist, ähnlich wie es auch bei Objekten der Fall ist.

mleyen 10. Apr 2010 15:02

Re: Pointer und "^"
 
Zitat:

Zitat von NamenLozer
Zitat:

Zitat von Corpsman
FPC Verlangt auch das @ bei der Zuweisung von Notify Events. Delphi will die so viel ich weis glaube ich nicht haben...

Wobei man darüber natürlich diskutieren kann. Ich persönlich finde die Schreibweise ohne @ logisch, weil für mich die Funktion bereits die Adresse ist, ähnlich wie es auch bei Objekten der Fall ist.

Darf ich dazu mal folgendes Gegenargument bringen:
Zitat:

Zitat von NamenLozer
usninnig und nur für Leute, die zu faul sind, ein zusätzliches Zeichen zu tippen.

Imho ist Aussage mist. Denn ich halte es für unsinnig unnötige Zeichen zu schreiben.
Und jetzt noch der kaufmännische Bringer: Es ist sogar kostensparend.

Ich lasse selber das @ auch immer weg, denn es ist funktionierender übersichtlicher Code.
Bei Pointern genau das gleiche nur da ich nahezu nie mit Pointern arbeite, verwende ich das ^ auch kaum.
Im Endeffekt ist es für ein reines Delphiprojekt *schnurz piep egal*, genauso wie bei der Code-Formatierung.

Delphi-Laie 10. Apr 2010 15:05

Re: Pointer und "^"
 
Naja, dieses Dach der Tastatur zu entlocken, ist ja eine noch größere Zumutung als die geschweiften Klammern in C & Co.

Hinzu kommt, daß man ständig aufpassen (oder sich vom Compiler belehren lassen) muß, an welcher Stelle dieses Zeichen denn nun korrekt gesetzt wird. Ich konnte (und mochte) es mir jedenfalls bis heute nicht merken.

Zitat:

Zitat von NamenLozer
Zitat:

Zitat von Corpsman
FPC Verlangt auch das @ bei der Zuweisung von Notify Events. Delphi will die so viel ich weis glaube ich nicht haben...

Wobei man darüber natürlich diskutieren kann. Ich persönlich finde die Schreibweise ohne @ logisch, weil für mich die Funktion bereits die Adresse ist, ähnlich wie es auch bei Objekten der Fall ist.

Jain. Letztlich sind doch alle zugreifbaren Elemente im Speicher adressiert (alle direkt über Speicheradressen aufrufbar?). Dennoch dürfen bei den meisten dieser Elemente Zeigeradressierungen nicht benutzt werden.

mkinzler 10. Apr 2010 15:07

Re: Pointer und "^"
 
Zitat:

Imho ist Aussage mist. Denn ich halte es für unsinnig unnötige Zeichen zu schreiben.
Und jetzt noch der kaufmännische Bringer: Es ist sogar kostensparend.
Wenn du deinen Code als einmaliges Wegwerfprojekt ansiehst gebe ich dir Recht, sonst absolut nicht!!
[Edit: Zitat eingefügt, auf welches sich mein Beitrag bezieht]

Medium 10. Apr 2010 15:14

Re: Pointer und "^"
 
Hier geht's doch auch denk ich ein bischen um semantische Korrektheit. Wenn ich einen expliziten Zeigertypen verwende, würde eine implizite Dereferenzierung schlicht inkonsequent wirken. Etwas ganz anderes sind da Objektinstanzreferenzen und Methodenzeiger: Diese sind zwar intern auch nur Pointer, aber semantisch ein ganz eigenes Konstrukt! Daher ist die implizite Dereferenzierung hier sehr wohl sinnvoll, also auch bei Zuweisung von Events ohne "@", es sei denn es wird explizit an einen Zeigertypen, nicht einen Methodentypen zugewiesen - aber wer macht das schon :)

Namenloser 10. Apr 2010 15:15

Re: Pointer und "^"
 
Zitat:

Zitat von Delphi-Laie
Zitat:

Zitat von NamenLozer
Zitat:

Zitat von Corpsman
FPC Verlangt auch das @ bei der Zuweisung von Notify Events. Delphi will die so viel ich weis glaube ich nicht haben...

Wobei man darüber natürlich diskutieren kann. Ich persönlich finde die Schreibweise ohne @ logisch, weil für mich die Funktion bereits die Adresse ist, ähnlich wie es auch bei Objekten der Fall ist.

Jain. Letztlich sind doch alle zugreifbaren Elemente im Speicher adressiert (alle direkt über Speicheradressen aufrufbar?). Dennoch dürfen bei den meisten dieser Elemente Zeigeradressierungen nicht benutzt werden.

Naja, der Unterschied ist folgender: Wenn ich z.B. einen Pointer auf einen Integer habe, erhalte ich, wenn ich ihn dereferenziere, einen bestimmten, fest definierten Typ, nämlich eine Zahl. Was aber erhalte ich, wenn ich eine Funktion dereferenziere? Den Maschinencode an dieser Adresse? Aber was soll das für ein Datentyp sein? Er ist nirgens definiert und zudem noch plattformabhängig. Was sollte ich also damit anfangen? Diese Daten werden vom Compiler generiert und gehen mich im Grunde nichts an. Bei Objekten ist es ebenso, denn auch diese Struktur wird intern vom Compiler verwaltet und könnte sich theoretisch auch mal ändern.

[edit]
Wenn schon Kommasetzung und Rechtschreibung, dann wenigstens richtig.
[/edit]

mleyen 10. Apr 2010 15:28

Re: Pointer und "^"
 
Zitat:

Zitat von mkinzler
Zitat:

Imho ist Aussage mist. Denn ich halte es für unsinnig unnötige Zeichen zu schreiben.
Und jetzt noch der kaufmännische Bringer: Es ist sogar kostensparend.
Wenn du deinen Code als einmaliges Wegwerfprojekt ansiehst gebe ich dir Recht, sonst absolut nicht!!

Bitte?^^
Meine Firmen/-Privatprojekte werden bestimmt nicht als Wegwerfprojekte angesehen, aufgrund eines nicht gesetztem ^ und @. :shock:
Embaccadillo wird solchen Code sicherlich niemals als fehlerhaft ansehen.
Ich behaupte jetzt mal, dass sich deine Aussage auch auf die Code-Formatierung bezieht. Die wird bei uns eh von jedem so automatisiert umgehauen wie er es haben will.
Und ich bin mir auch sicher, dass man das "^" und "@" auch automatisiert in ein Projekt ein/ausblenden lassen kann. (Der Compiler bemerkt ja auch die richtigen Stellen)

mkinzler 10. Apr 2010 15:33

Re: Pointer und "^"
 
Ja, es bezog sich auch darauf.

Ich finde es aber komisch, dass diejenigen die den korrekten Code verwenden ( mit ^) als ineffektive/teure Programmierer zu brandmarken, weil sie kaufmannisch nicht kostensparend programmieren!

Wobei bei Fehlersuche eher umgekehrt ist, da man Dank des Mehrcodes ( explizite De-/Referenzierung) schnell sihet dass es sich um Pointer handelt

Namenloser 10. Apr 2010 15:35

Re: Pointer und "^"
 
Zitat:

Zitat von mkinzler
Ich finde es aber komisch, dass diejenigen die den korrekten Code verwenden ( mit ^) als ineffektive/teure Programmierer zu brandmarken, weil sie kaufmannisch nicht kostensparend programmieren!

Ich glaube nicht, dass er das ganz ernst gemeint hat :zwinker:

mkinzler 10. Apr 2010 15:37

Re: Pointer und "^"
 
Er hat es aber so geschrieben!
Vielleicht sollte man dann auch Sekretärinnen programmieren lassen, die gaben nämlich mehr Anschläge pro Minute -> mehr Code pro Zeit -> höhere Effektivität :stupid:

samso 10. Apr 2010 15:38

Re: Pointer und "^"
 
:zwinker:
Ich denke, dass man beim dereferenzieren von Zeigern das entsprechende Symbol nicht angeben muss, ist ja vermutlich ein Nebenprodukt der Tatsache, dass man die Angabe dieses Symbol beim Zugriff auf Objekte vermeiden wollte. Dadurch ist Delphi als Programmiersprache aus meiner Sicht nicht mehr konsistent. Man wollte aber wohl den internen Zugriffsmechanismus auf Objekte vor dem Programmierer verbergen, was dann für den Neueinsteiger auch gleich zu Problemen führt. Jedenfalls ist erstmal nicht besonders einleuchtend, warum eigentlich die Zuweisungen eines Rekords den Inhalt kopiert, bei einem Objekt jedoch nur die Referenz kopiert wird. Konsequenterweise muss man also das ^ immer weglassen, oder? Gerade jetzt, wo die Turbo-Pascal-Objekte eine Wiederauferstehung in Form von Records-mit-Methoden feiern.
:zwinker:

mkinzler 10. Apr 2010 15:39

Re: Pointer und "^"
 
Oder konsequenterweise immer verwenden um Pointer und Referenzen zu unterscheiden

omata 10. Apr 2010 15:44

Re: Pointer und "^"
 
Meine Güte habt ihr Probleme, das ist ja wieder mal nicht auszuhalten :wall:

Wenn man den Inhalt eines Zeigers haben möchte, dann referenziert man diesen und sonst nicht. Nur weil der Delphicompiler hier so blind ist (und Lazarus in diesem Punkt wirklich konsequenter ist) kann man doch trotzdem so programmieren, dass man sieht, was man da eigentlich macht. Einige wollen das nicht verstehen: ok, dann eben nicht. Aber trotzdem ist das ein Unterschied, das ist genauso wie der Internet Explorer, der versucht HTML-Fehler zu interpretieren, ein absoluter Grauß für die Web-Entwicklung.

Nichts anderes ist das hier, damit befasst man sich einmal, versteht es und macht es dann richtig. Wo ist das Problem?

Daniela.S 10. Apr 2010 16:04

Re: Pointer und "^"
 
Hoppla, was habe ich denn da losgetreten? Scheint was religiöses an sich zu haben *ggg*

Ich weiss jetzt zwar nicht ob ich das noch aus TurboPascal Zeiten gewohnt bin, aber die Lesbarkeit ist für mich sehr wichtig. Vor allem wenn ich einige Monate nicht an einem Projekt gearbeitet habe.

Pointer verwende ich schon recht oft und da ist für mich die Lesbarkeit und Unterscheidung der Objekte sehr wichtig.

Dass man schneller programmiert wenn man das Zeichen weglässt halte ich für, entschuldigt den Ausdruck, lächerlich. Das Wichtigste ist den Code so zu schreiben, dass man ihn auch noch Wochen, Monate oder Jahre nachher lesen kann. Ansonsten fängt dann eine ewig lange Suche an. Die zwei Sekunden die man vorher gespart hat sind dann schnell weg.

samso 10. Apr 2010 17:21

Re: Pointer und "^"
 
...und manchmal geht es ja auch nicht anders.
Delphi-Quellcode:
with PointerToMyRecord^ do
  Irgendwas := 0;
Da wäre es schon merkwürdig an anderer Stelle dann
Delphi-Quellcode:
PointerToMyRecord.Irgendwas := 0;
zu schreiben, oder? Mein Votum: Nicht abgewöhnen.



Zitat:

kann man doch trotzdem so programmieren, dass man sieht, was man da eigentlich macht.
Na ja, geht so.. Die Hilfe schreibt zwar zu "Klassen und Objekte"
Zitat:

Eine Klassentypvariable ist eigentlich ein Zeiger auf ein Objekt. ... Sie brauchen in diesem Fall nicht MeinObjekt^.Size := 100 anzugeben
Aber tatsächlich kann ich das nicht schreiben, selbst wenn ich wollte.

Medium 10. Apr 2010 17:46

Re: Pointer und "^"
 
Weil es bei Objekten auch semantisch falsch wäre. Das ist schon i.O. so.

Aus dem gleichen Grund muss man bei C# zum Beispiel immer Parameter mit dem Schlüsselwort "ref" definieren und übergeben, wenn eine Objektreferenz gewollt ist. Das ist herrlich konsequent an der Stelle.

himitsu 11. Apr 2010 08:29

Re: Pointer und "^"
 
Zitat:

Zitat von mleyen
(Der Compiler bemerkt ja auch die richtigen Stellen)

Wenn man einen "funktionierenden" Parser besitzt, dann wäre sowas schon möglich.

Hier wäre es aber mal praktisch, wenn die nächste Generation des Delphi-Parsers frei zugänglich wäre und dieser nicht nur Compilerintern versteckt wäre.
Dann könnte man auch endlich mal das ErrorInsite :stupid: "reparieren".


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz