![]() |
Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Wes Grundes läßt der Delphicompiler solchen Schund zu, ohne daß der Pointertyp explizit dereferenziert werden muß? Ich finde sowas widerlich, weil es die Syntax ungenau macht. Schlimmer noch, warum greift die Seuche um sich und benutzen die Delphianer diese ungenaue Syntax?
Los, macht mich fertig :zwinker: |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Du meinst, es müsste eigentlich so heißen:
Delphi-Quellcode:
Pointertyp(pBla)^.Member
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Nichts hindert dich das so zu schreiben.
Aber es wäre doch ziemlich lästig wenn man laufend Form1^.ShowModal; Button1^.Enabled := False; ... schreiben müsste. Und außerdem ermöglicht das eine leichtere Portierung nach .NET. |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Wenn es diese Art Compilermagic nicht geben würde, würde kein Hahn da anch krähen und es so akzeptieren. In anderen Sprachen ist es ja auch nicht anders. Die explizite Dereferenzieruzng hat eiegntlich den Vorteil, dass man genau sieht, wann man es mit einem Zeiger zu tun hat und, wann nicht. Gerade bei Delphi Anfängern führt das zu Verständnisproblemen, denke ich.
Übrigens gerade probiert:
Delphi-Quellcode:
Fehlermeldung:
Button1^.Enabled := False;
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Warum ? Weil die Schreibweise
Delphi-Quellcode:
exakt die gleiche Funktionalität erzwingt wiePointer^.Member
Delphi-Quellcode:
Also warum sollte man es dann nicht auch vereinheitlichen bzw. abkürzen ?
Pointer.Member
Oder anders ausgedrückt: das Ziel ist das Gleiche, die basierende Typinformation ist irrelevant für den Leser des Sources, denn um die Typsicherheit soll sich gefälligst der Compiler in meinem Auftrag kümmern. Es ist mir echt schnuppe in diesem Moment ob ein Pointer auf einen Record oder ein simpler Record oder ein Objekt oder sonstwas angesprochen wird, hauptsache ich greife auf das richtige Member mit der richtigen Methode zu. Die explizite Dereferenzierung ist also nur ein unnötig störendes Element in einem Source der inhaltlich keinerlei Mehrinformation zum Verständnis in diesem Moment der Quellttextzeile bietet. Dafür sind ja die separaten Typdeklartionen zuständig. Und, falls du dich entschließen solltes eines Tages deinen Pointer auf Record in einen Record im Stack oder in eine Klasse zu verwandeln, dann ist die neue Schreibweise kompatibel ohne Änderungen ! Übrigens, in Assembler kennt man syntaktisch diesen Unterschied ebenfalls nicht. Gruß Hagen |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Ich halte das jetzt für eine Scherzfrage mit halbernsten Hintergrund. :freak:
Sorry Ollie, aber wie hässlich wäre Code, wenn ich jede Objektinstanz erst dereferenzieren müsste? :shock: Was ich nicht kapiere ist, dass der Delphicompiler (und die RTL) keine Typensicherheit erzwingt. Warum kann ich das machen:
Delphi-Quellcode:
Das ist doch geradezu widerlich...
var
someInt : Integer; begin TObject(someInt) := TObject.Create(); dec(someInt); TObject(someInt).Free(); Typensicherheit heißt für mich, dass eine Instsnz von TSomeType auch wirklich das ist, was sie mir vorgaukelt. |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Warum es in C und C++ eingefuehrt wurde verstehe ich nicht, denn dort gibt es den -> Operator.
Bei Delphi macht das ja Sinn. Besonders fuer Member einer Klasse, da eine Klassenreferenz formal kein Zeiger ist. Die Klassenreferenz ist nur als Zeiger implementiert. Das es fuer alle Zeiger geht, liegt an der Art wie die Zeiger von C (besonders PChar) in Delphi eingepasst wurden. Es ist also weniger ein neu eingefuehrtes Feature wie bei C++ sondern eher ein notwendiges Uebel der Kompatibilitaet zu C. |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Zitat:
Zitat:
Aber Gegenfrage: Warum gibt's das überhaupt, wenn ich es doch auch ohne ^ schreiben kann? Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Delphi-Quellcode:
weil man ja nicht unbedingt nur pBla hat
Pointertyp(pBla)^.Member
Delphi-Quellcode:
das brauch ich für meien vorhaben schon etwas öfter ;)
procedure mycopymemory(addr,addr2: pointer; size: cardinal);
var i: cardinal; begin for i := 0 to size-1 do pbyte(cardinal(addr)+i)^ := pbyte(cardinal(addr2)+i)^; end; |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Zitat:
Delphi-Quellcode:
Würde man nur "ti.Name" schreiben (das kompiliert nicht!), dann wäre das für den Compiler "ti^.Name" was schlicht weg falsch ist und deswegen nicht kompiliert.
S := ti^^.Name;
Zitat:
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Nein, aber ich schätze ihn fachlich und inzwischen auch menschlich, weil er eben ein patenter Mensch ist. Und wenn er mir in so einem Thema beipflichtet, freut mich das natürlich. |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Delphi-Quellcode:
In beiden Fällen steht in EDX ein Zeiger, die Derefernzierung erfolgt IMPLIZIT beim Zugriff auf den Zeiger. Der Zugriff auf ein Member eines Records der den Zeiger benötigt erfolgt ohne syntaktisch explizite Dereferenzierung !asm MOV EAX,[EDX] MOV EAX,[EDX].Member end; Es ist egal ob EDX nun einen Zeiger auf einen allozierten Speicherbereich enthält, oder Self eines Objektes, oder ein stinknormaler Record im Stack ist. Warum ist es egal ? Ganz einfach, weil es syntaktisch keine Relevanz für uns hat, es ist uns informell schnuppe, worauf wie da im Moment zugreifen. Wichtig ist doch nur die Zielorientierung in unserer Sprache. Das Ziel ist uns wichtig, nicht der Weg dahin über einen Zeiger oder sonstwas. Zeiger, Records, Objekt sind Datenkontainer die nach Möglichkeit nur durch und für den Compiler eine Relevanz haben. Wir entscheiden uns bei der Deklaration einmalig für einen dieser Typen damit der Compiler WEIS was WIR von ihm wollen. Aus unserer menschlichen Denksicht heraus ist es uns im Grunde schnuppe, hauptsache es ist laufsicher und effizient, und das sicherzustellen ist Aufgabe des Compilers. Wir entwicklen immer neuere Sprachen und Compiler die immer mächtiger werden, warum ? Weil wir eben über solch lästiges Beiwerk nicht nachdenken wollen, für uns ist nur das finale Ziel interessant. Warum gibt es die explizite Derefernzierung in PASCAL mit ^ ? Ganz einfach, weil es historisch gewachsen ist. Weil bei der Entwicklung jeder Sprache die Entwickler nach links & rechts schauen und Konzepte anderer Sprachen kopierten ! .NET und C# sind doch auch nur abgeschaute Konzepte aus diversen anderen, älteren Sprachen. Wie eben PASCAL Delphi. Zitat:
Denn gäbe es keine solche Dereferenzierungen dann müsste man bei der Sprachsyntax einer Deklaration eines Zeigers auf einen Zeiger ganz andere Schreibweisen einführen. Es macht keinen Sinn einen Zeiger auf einen Zeiger zu deklarieren, dies wird nur jegliche Typsicherheit im Compiler und informationstheoretische Sicherheit beim Lesen eines Source durch einen Menschen, reduzieren. Gruß Hagen |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Code:
stehen, würde die Adresse nach EAX kopiert werden, bei deinem
MOV EAX, EDX
Code:
die vier Byte, die an der Speicherstelle stehen, auf die die Adresse in EDX zeigt.
MOV EAX, [EDX]
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Delphi-Quellcode:
... aber das andere ist lesbarer. Ist also nix besonderes und dient auch nicht der Argumentation, weil es aus anderen Gründen so existiert.
asm
MOV EAX,[EDX] MOV EAX,[EDX+<offset Member>] end; Zitat:
Wäre es nicht so, müßte folgender Code durchgehen (was er nicht tut):
Code:
MOV EAX, EDX.Member
Zitat:
@tommie-lie: Du weißt, ich gebe dir ungern recht ... hast es dir aber verdient. Die eckigen Klammern sind eben explizite Dereferenzierungen. BTW: Man kann in Assembler in einem einzelnen Ausdruck nicht mehrere Dereferenzierungen vornehmen ... in Delphi geht dies. Nachtrag: tommie-lie machte mich gerade darauf aufmerksam, daß vor Member noch ein Typ gehört ;) |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
@Olli: Hat die Frage vielleicht irgendwas mit meinem Problem von gestern zu tun? Das kommt mir so bekannt vor... :zwinker: |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Nein, in Assembler dereferenziert man immer Zeiger, dort gibt es nichts anderes. Somit gibt es auch keinerlei Unterscheidungsmerkmale die uns stören könnten. In PASCAL gibt es im Grunde auch nur Zeiger, logisch die CPU arbeitet halt nur mal so und nicht anders. Wichtig ist doch nur der Unterschied für uns Menschen in informeller Natur. Dieser Unterschied definiert die Leistungsfähigkeit der Programmiersprache. Je abstrakter, sprich unspezifischer, unsere Programmiersprachen werden desto mehr muß der Compiler stupide Arbeit übernehmen, und desto mehr können wir uns bei der Arbeit auf die wirklich relevanten Sachen konzetrieren die keine Maschine wie ein Compiler heutzutage UNS abnehmen kann. Und das ist die Zielsetzung des Lösens von komplexen Problemen. Jede Vereinheitlichung in der Syntax die zu einer höheren Abstraktion führen wird ist also exakt der richtige Weg. Und der Verzicht auf die explizite Dereferenzierung im Source ist genau so ein Schritt zu höherer Abstraktion. Wir bestimmen damit über unsere Programmiersprache das von jetzt an der Compiler UNS die Arbeit mit der expliziten Dereferenzierung abzunehmen hat und somit wird diese Derefernzierung in unseren Augen impliziert !! Und wieder ist ein unnötiger informeller Schritt in unseren Source ausgemerzt worden. Schau mal: argumentierst du FÜR die explizite Dereferenzierung so ignorierst du alle neueren Entwicklungen in den Programmiersprachen. Theoretisch müsstest du ausschließlich nur in Assembler, ja sogar nur mit Lochstreifen programmieren wollen. Irgedwann einmal werden wir so programmieren: "baue eine TCP/IP Verbindung auf und downloade alle notwenigen Dateien". Der Compiler wird dies übersetzen können und dann Additionen, Speicherkopierungen, API Aufrufe, Objekte erzeugen und freigeben, sogar explizit intern Dereferenzierungen durchführen. Also all das was wir heute noch von Hand erledigen müssen. So ein Program bestünde heutzutage noch aus Millionen von Quelltextzeilen, aber in Zukunft wird dem Compiler dafür nur der obige Satz ausreichend sein. Für uns Menschen bedeutet es aber das wir innerhalb eines gesprochenen, ja eventuell nur gedachten, Satzes exakt die Zielsetzung für die Maschine definieriert haben, mehr wollen wir doch garnicht. Kannst du nun diese Entwicklung in unserer Arbeit leugnen ?? Ich meine also das die Abschaffung der expliziten Dereferenzierung nur ein klitzekleiner Schritt in die richtige Richtung bei der Evolution unserer Programmeirsprachen ist. Aus dieser logischen Konzequenz heraus programmiere ich eben, da wor es geht, in Delphi immer mit der impliziten Dereferenzierung. Aber, grundsätzlich kann das jeder so halten wie er möchte, man muß sich eben immer im klaren sein das man die Zeichen der Zeit so eventuell mißachtet. Gruß Hagen |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
anderes Beipsiel:
Delphi-Quellcode:
Hier setzten wir in dem Namen eines Types gleichzeitig auch den Typus dessen mit rein.type ptrData = ^Data; Was haben wir gelernt über C/C++ in diesem Falle ? Warum programmieren wir lieber in PASCAL ohne eine solche Vorgehensweise ? Ja, ich weiß, es gibt heute noch ähnliche Muster auch in Delphi. Aber es ist wohl unbestitten das diese Unsitte in Delphi bei weitem nicht solche Ausmaße annehmen kann wie in C/C++. Wir sehen das im Zusammenhang mit der Typsicherheit in Delphi, aber das halte ich für viel zu engstirnig betrachtet. Schaut euch die neueren Sprachen an, dort ist man in diese Richtung noch viel stärker vorangeschritten. Fazit: Abstraktion ist ein ganz erhebliches Element in der Zukunft der Sprachen. Abstraktion bedeutet aber das immer mehr an Deklarationen, Quelltexten Implikationen enthalten wird. Der Compiler wird also diese Implikationen übersetzen müssenund daraus die informell aufwenigeren expliziten Umsetzungen für UNS selber vornehmen. Gruß Hagen |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
@Olli:
Zitat:
Also: wir reden ja von Dereferenzierungen aus syntaktischer Sicht, und also solches bezog ich mich mit meiner Aussage natürlich nur auf die Syntax in Assebler bei der man diese auch anwendet. Mir geht es doch nur darum ob die Syntax einheitlich Typeübergreifend ist. Und die explizite Dereferenzierung in PASCAL steht im Gegensatz zur impliziten Dereferenzierung aller anderen Typen. Die einzigste Ausnahme stellt der Typ Pointer dar. Betrachtet man dies aus Sicht der Abstraktion so ist es für uns unerheblich welcher Datentyp bei der impliziten Derefernzierung angesprochen wird. Das wäre eben so also ob wir im Namen dieser Variablen immer wieder den Datentyp mit integrieren. Auch dies ist überflüssige Information, zuviel Redundanz. Gruß Hagen |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Code:
typedef Data *ptrData;
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Code:
auch einen typisierten Pointer erhalten? Aber ich bevorzuge eigentlich
typedef SomeType *PSomeType
Code:
und habe dann mit blubb einen Pointer, der zumindest in C++ ebenso "sicher" ist, wie in DelphiLanguage, eine Dereferenzierung mit *blubb bringt mich zurück zum Typ SomeType mit allen seinen Members, unabhängig davon was ich vorher in blubb für einen Käse reingeschrieben habe. Exakt genauso verhält sich ein ^Data-Pointer in Delphi. Übrigens kann ich sowohl in C, als auch in Delphi einen derartigen Pointer in einen anderen Pointer-Typ casten und dereferenzieren. Dann lande ich nochmal woanders. Das ist das schöne an Pointer :mrgreen:
SomeType *blubb
Zitat:
Zitat:
Edit: Mist, zu langsam... |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Zitat:
Das IST Abstraktion. Einmalig definierst du diesen Typ damit der Compiler WEIS was er damit machen soll. Und im restlichen Source arbeitest DU auf diesen abstrakteren Typ, weil es für UNS den Source lesbarer macht. Zitat:
Mein Meinung das ist ! Gruß Hagen |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Und schon heute erachte ich die Fehlermeldungen und Warnungen des Compilers für eine solche "Diskussion", nur eben ohne "intelligente" Vorschläge des Compilers. Vertrackte Argumentation mit dem Mathematiker die du da führst. Denn Mathematiker denken infinitiv und exakt diese Denkweise ist widersprüchlich zu einem Informatiker. Viele Aussagen der Mathematiker sind also eineindeutig und infinitiv richtig, aber finitiv und praktisch betrachtet nicht realisierbar. Ein Ingeneur, wie wir es welche sind, kann öfters mit solchen Aussagen leider nichts anfangen. Aus meiner Sicht hast du mit dieser Argumentation exakt in meine Richtung gearbeitet ;) Gruß Hagen |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Zitat:
Delphi-Quellcode:
Habe ich jetzt einen LongInt oder einen ShortInt geschrieben? Du siehst, auch unter Delphi ist es mir wurscht, was für ein Typ dahintersteckt. Es gibt da keinen Unterschied zwischen C und Pascal, ich weiß also nicht, welche "Unsitte" du meinst, die in Delphi nicht solche Ausmaße hätte.
type
PBlah = ^TBlah; TBlah = record Member1: LongInt; end; type PBlubb = ^TBlubb; TBlubb = record Member2: ShortInt; end; var SomeBlubb: PBlubb; SomeOtherBlubb: TBlubb; begin SomeOtherBlubb.Member2 := 5; SomeBlubb := @SomeOtherBlubb; PBlah(SomeBlubb)^.Member1 := 5; end; Zitat:
|
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Ist doch im grunde egal und enthält keine zusätzlich wertvollen Informationen die den Source lesbarer für uns Menschen macht. DU dereferenzierst diesen nur aus Prinzip, aus einer für dich sinnvollen Vereinbarung, Festlegung. Ist diese Festlegung wirklich sinnvoll ? Gruß Hagen |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Delphi-Quellcode:
Weißt du jetzt noch, ohne 20 Seiten nach oben zu scrollen, in was für eine Datestruktur ich 42 schreibe ob ich 42 in einen dereferenzierten Pointer schreibe, oder nicht?
type
PBlah = ^TBlah; TBlah = record Member: LongInt; end; type PBlubb = ^TBlubb; TBlubb = record Member: ShortInt; end; function DoSomething(aBlubb: TBlubb): PBlah; begin Result := @aBlubb; end; // imagine 20 pages of other code here var SomeBlubb: TBlubb; begin SomeBlubb.Member := 5; DoSomething(SomeBlubb).Member := 42; end; |
Re: Warum läßt Delphi das zu: Pointertyp(pBla).Member???
Zitat:
Delphi-Quellcode:
DoSomething(SomeBlubb).Member := 42;
Warum sollte mich das in obiger Zeile interessieren ? Ich möchte doch nur 42 abspeichern. Der Rest, sprich wie und wo und ob typsicher das ist doch Aufgabe des Compilers. Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz