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

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

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

Beitragvon Mathias » 4. Jul 2018, 21:42 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 4. Jul 2018, 22:02 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

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.
indianer-frank
 
Beiträge: 133
Registriert: 30. Nov 2008, 21:53

Beitragvon Mathias » 4. Jul 2018, 22:07 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon indianer-frank » 4. Jul 2018, 22:26 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

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.
indianer-frank
 
Beiträge: 133
Registriert: 30. Nov 2008, 21:53

Beitragvon mse » 5. Jul 2018, 07:22 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

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.
mse
 
Beiträge: 1986
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Mathias » 5. Jul 2018, 17:41 Re: [gelöst] Procedure ohne Var dennoch mit oder ohne '()'?

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •
Vorherige

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

porpoises-institution
accuracy-worried