[gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von Mathias »

Na ja, Pi und Random sind werden doch häufig gebraucht. Und Pi() wäre doch äußerst ungewöhnlich! Ich denke, viele wissen noch nicht einmal, daß das eine Funktion ist.

Das mit dem Random wollte ich auch gerade schreiben.
Das pi eine Function ist, habe ich bis jetzt auch nicht gewusst, ich dachte immer, dies sein eine Konstante, aber du hast recht:

Code: Alles auswählen

    function pi : ValReal;[internproc:fpc_in_pi_real]; // mathh.inc

Somit lohnt es sich, wen es auf Geschwindigkeit ankommt, pi in eine Variable kopieren, oder selbst eine Konstante deklarieren.

Was noch interessant ist, so eine Deklaration geht:

Code: Alles auswählen

const
  p = pi;


Aber dies geht nicht:

Code: Alles auswählen

function myPi:Single;
begin
  Result := 3.14;
end;
 
const
  p = myPi; // Syntax-Fehler
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von indianer-frank »

Ich glaube (habe aber gerade keine Referenz dafür), alles was zur Compile-Zeit bekannt ist, kann benutzt werden. ZB compiliert zu mindest ab FPC2.0.4

Code: Alles auswählen

const
  x1 = sqrt(2);
  x2 = sqrt(Pi);
  //  x3 = random; {geht nicht}
  x3 = sin(Pi/4);
begin
  writeln(x1:26,x2:26,x3:26);
end.
 
ohne Probleme und liefert die richtigen Werte. Allerdings ist dies schwer FPC-specifisch. Delphi und andere Pascalcompiler erlauben das nicht.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von Mathias »

Ich glaube (habe aber gerade keine Referenz dafür), alles was zur Compile-Zeit bekannt ist, kann benutzt werden.

Komisch, warum geht es dann mit myPi nicht ? :roll:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von indianer-frank »

Mathias hat geschrieben:Komisch, warum geht es dann mit myPi nicht ? :roll:
Meine Erklärung: Weil es nicht bekannt ist, in dem Sinne, daß der Compiler die Funktion nicht zur Compilezeit aufrufen kann. Die Funktionen aus system sind bekannt und können benutzt werden. Du weißt durch Hinsehen, was myPi liefert. Aber die Semantik interessiert den Compiler nicht (was wäre zB wenn myPi den Wert aus einer Datei liest?). Dies geht zB auch nicht

Code: Alles auswählen

uses
  math;
const
  x1 = sinh(2);
 
Edit: Hier die Passage aus der englischen Doku https://www.freepascal.org/docs-html/cu ... 1-200002.1
The compiler must be able to evaluate the expression in a constant declaration at compile time. This means that most of the functions in the Run-Time library cannot be used in a constant declaration. Operators such as +, -, *, /, not, and, or, div, mod, ord, chr, sizeof, pi, int, trunc, round, frac, odd can be used, however. For more information on expressions, see chapter 12, page 534.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von mse »

Mathias hat geschrieben:Somit lohnt es sich, wen es auf Geschwindigkeit ankommt, pi in eine Variable kopieren, oder selbst eine Konstante deklarieren.

Da wäre ich mir nicht so sicher. Vielleicht wurde pi als internproc implementiert, damit der Compiler den optimalen Code erzeugen und z.B. die interne Konstante der FPU verwenden kann. Dies ist aber reine Spekulation meinerseits.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

Beitrag von Mathias »

Da wäre ich mir nicht so sicher. Vielleicht wurde pi als internproc implementiert, damit der Compiler den optimalen Code erzeugen und z.B. die interne Konstante der FPU verwenden kann. Dies ist aber reine Spekulation meinerseits.
Die ValReal ist als Extended deklariert und wen einem Single genügt, wird zu viel Power verbrennt.

ng: Weil es nicht bekannt ist, in dem Sinne, daß der Compiler die Funktion nicht zur Compilezeit aufrufen kann. Die Funktionen aus system sind bekannt und können benutzt werden.
Das wird wohl die Unit System der Grund sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten