Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Merkwürdiges Verhalten bei einer Delphi-eigenen Funktion und erweiterter Syntax (https://www.delphipraxis.net/176353-merkwuerdiges-verhalten-bei-einer-delphi-eigenen-funktion-und-erweiterter-syntax.html)

Delphi-Laie 29. Aug 2013 14:22

Delphi-Version: 5

Merkwürdiges Verhalten bei einer Delphi-eigenen Funktion und erweiterter Syntax
 
Hallo Delphifreunde!

Beim Versuch, jemandem zu demonstrieren, daß nicht alle Fehler vom Delphi-Compiler (Version 4) gefunden werden, kam ich auf die Idee, einfach

sqrt(-1)

in einen Quelltext einzufügen - die erweiterte Syntax ist eingeschaltet. Doch es kam bei der Syntaxprüfung die Fehlermeldung

"Anweisung erforderlich, aber Ausdruck vom Typ 'Real" gefunden."

Merkwürdig, das ist doch eine Funktion, die bei der erweiterten Syntax ihr Ergebnis nirdgendwohin weitergeben muß?!

Unter "Deklaration suchen" kam ich - wenig überraschend - in die Unit System (diese Quelle steht auch in der Hilfe), dort gibt es aber die Zeichenkette "sqrt" nicht. Vermutlich wurde eine ander Quelltextunit beigelegt, als die zur Compilierung verwendet wurde, oder sqrt ist "noch tiefer" im System verankert (nämlich im Compiler) als in der Unit "System" abgelegt worden zu sein, und "Deklaration" verweist dann einfach - fälschlicherweise - zur Unit "System".

Es kommt noch merkwürdiger: Über "System." Code Insight aufgerufen, und dort findet sich tatsächlich doch "procedure sqrt" (ohne weiteren Parameter). Also, als Prozedur müßte es nicht nur keinen Funktionswert haben, sondern überhaupt keinen zurückliefern imstande sein, kann sqrt, wenn man es benutzt, aber natürlich doch, denn es ist ja eine Funktion.

So ist das mit dem Vorführeffekt, der kann sogar auch nach einem Vierteljahrhundert Freizeitprogrammiererei bei einer solch simplen Angelegenheit zuschlagen.

Weiß jemand eine Erklärung? Ist die erweiterte Syntax nur bei selbstgeschriebenen Funktionen möglich?

Danke im voraus für Euer Interesse und ggf. auch für die Antwort(en)!

Gruß Delphi-Laie

baumina 29. Aug 2013 15:00

AW: Merkwürdiges Verhalten bei einer Delphi-eigenen Funktion und erweiterter Syntax
 
Evtl. liegt es einfach nur daran, dass man das Projekt nach Änderung der Compiler-Optionen neu erzeugen muss (Shift+F9) und nicht nur neu compilieren.

Uwe Raabe 29. Aug 2013 15:24

AW: Merkwürdiges Verhalten bei einer Delphi-eigenen Funktion und erweiterter Syntax
 
Es könnte auch einfach an dem veralteten Delphi 5 liegen, bei dem das sqrt direkt vom Compiler aufgelöst wird. In neueren Delphi-Versionen ist das je nach Zielplattform zwar unterschiedlich, aber als echte Assembler-Funktion in System.pas implementiert und da funktioniert die erweiterte Syntax auch.

Bjoerk 29. Aug 2013 15:45

AW: Merkwürdiges Verhalten bei einer Delphi-eigenen Funktion und erweiterter Syntax
 
Hängt wohl von der Compilerversion ab. Bei mir in D2007 läuft z.B. das, in XE3 wohl nicht mehr?

Der schöne Günther 29. Aug 2013 16:05

AW: Merkwürdiges Verhalten bei einer Delphi-eigenen Funktion und erweiterter Syntax
 
DocWiki:
Zitat:

Eine andere Lösung wäre, den betreffenden Ausdruck aus dem Quelltext zu entfernen.
Tolle Lösung. Ich glaube so gehe ich jetzt alle meine Probleme an... :-D

Delphi-Laie 29. Aug 2013 20:06

AW: Merkwürdiges Verhalten bei einer Delphi-eigenen Funktion und erweiterter Syntax
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1226622)
Es könnte auch einfach an dem veralteten Delphi 5 liegen, bei dem das sqrt direkt vom Compiler aufgelöst wird. In neueren Delphi-Versionen ist das je nach Zielplattform zwar unterschiedlich, aber als echte Assembler-Funktion in System.pas implementiert und da funktioniert die erweiterte Syntax auch.

Hallo Uwe Raabe, Deine Antwort trifft es wohl am ehesten.

Delphi 7 zeigt exakt das gleiche Verhalten. Turbo-Delphi hingegen compiliert es (m.E. das einzig korrekte Verhalten unter der sog. "erweiterten Syntax"), und bei "Deklaration suchen" wird auf eine gleichnamige (Assembler-)Funktion in der Unit System verwiesen (die wird dann tatsächlich gefunden). Auch wird, wie schon gesagt, "sqrt(-1)" als alleiniger Befehl ohne jede Wertzuweisung vom Compiler widerstandslos akzeptiert (der negative Radikant ist ja offensichtlich, aber alles kann man eben nicht berücksichtigen, soll die Compilierung nicht zu langsam werden), und beim Programmablauf kommt natürlich eine Exzeption.

gammatester 30. Aug 2013 08:06

AW: Merkwürdiges Verhalten bei einer Delphi-eigenen Funktion und erweiterter Syntax
 
Ich stimme mit Uwe überein. Das ist übrigens nicht das einzige Mal, daß Compiler-Magic-'Funktionen' speziell behandelt werden, weil's halt keine richtigen Funktionen sind, zB wird
Delphi-Quellcode:
if nil=addr(sin) then ;
von D2-D7 nicht kompiliert, ab D9 schon. Das komplett analoge Konstrukt
Delphi-Quellcode:
if nil=addr(sinh) then ;
wird von allen übersetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 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