Ändere die dpr-Datei der vorherigen Lektion auf folgenden Inhalt
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;
procedure MyProcedure(const A: Integer);
begin
WriteLn('A + 10 is: ', A + 10);
end;
function MyFunction(const S: string): string;
begin
Result := S + 'strings are automatically managed';
end;
var
X: Single;
begin
WriteLn(MyFunction('Note: '));
MyProcedure(5);
// Division mit "/" ergibt immer Gleitkommazahl, für Ganzzahldivision nutze "div"
X := 15 / 5;
WriteLn('X is now: ', X); // wissenschaftliche Notation
WriteLn('X is now: ', X:1:2); // 2 Nachkommastellen
end.Code-Sprache: PHP (php)
D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
Linking mydemo.exe
20 Zeilen kompiliert, 0,0 Sek, 39248 Bytes Code, 2484 Bytes Daten
D:\fpcdemo>mydemo
Note: strings are automatically managed
A + 10 is: 15
X is now: 3.000000000E+00
X is now: 3.00
D:\fpcdemo>Code-Sprache: CSS (css)

Unten die Zeilenweise Kommentarerklärung. Nicht-englische Zeichen können Zeichenmüll erzeugen; konfiguriere die Konsole für korrekte chinesische Ausgabe.
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;
// Eigener Name des Programms. Pascal-Konsolenprogramme beginnen immer mit program Name; danach folgen Variablendeklarationen, Prozeduren und Hauptcode
// Kein Rückgabewert: procedure Prozedur. Prozeduren und Funktionen laufen nur bei Aufruf
procedure MyProcedure(const A: Integer);
begin
WriteLn('A + 10 =:', A + 10);
end;
// Mit Rückgabewert: function Funktion
function MyFunction(const S: string): string;
begin
Result := S + 'Der Speicher von Strings wird automatisch vom System verwaltet';
end;
// Object Pascal hat keine main-Funktion, der äußerste begin...end.-Block ist Programmeinstiegspunkt. Unten der Hauptblock
var
X: Single; // Einfachgenaue Gleitkomma-Basistyp
begin
// Alle auszuführende Logik steht hier
WriteLn(MyFunction('Hinweis:'));
MyProcedure(5);
// "/" ergibt immer Gleitkommaergebnis, Ganzzahldivision mit div
X := 15 / 5;
WriteLn('X is now:', X); // Automatisch wissenschaftliche Schreibweise
WriteLn('X is now:', X:1:2); // Auf 2 Nachkommastellen begrenzen
end. // end. mit Punkt kennzeichnet das Ende des gesamten ProgrammsCode-Sprache: PHP (php)
Jede Funktion und Prozedur hat ein Paar begin und end zur Markierung des Funktionskörpers, entspricht { } bei C, C++, Java u.ä.
WriteLn gibt Text in die Konsole aus, einfache Hochkommata ‚ ‚ umschließen Stringliterale. WriteLn('A + 10 =:', A + 10); gibt nacheinander den String A + 10 =: und das Ergebnis von A + 10 aus.
Ein Programm darf nur einen äußersten begin und end. Block besitzen, darin steht der Hauptcode, der weitere Funktionen und Prozeduren aufruft.
X := 15 / 5;
WriteLn(‚X is now: ‚, X); // wissenschaftliche Notation
WriteLn(‚X is now: ‚, X:1:2); // 2 Nachkommastellen
/ steht für Gleitkommadivision, Ergebnis ist immer eine Gleitkommazahl.
Die ersten zwei Zeilen sind Präprozessoranweisungen
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}Code-Sprache: PHP (php)
Dies ist eine FPC-spezifische bedingte Kompilieranweisung
{$ifdef FPC}: Die mittleren Einstellungen werden nur ausgeführt, wenn der Compiler Free Pascal ist{$mode objfpc}: Wechsel in den ObjFpc-Syntaxmodus{$H+}: Aktiviert Langstrings (moderne automatisch verwaltete String-Typen, zwingend erforderlich){$J-}: Deaktiviert veränderbare Konstanten (Konstanten können nicht zur Laufzeit geändert werden, sicherer){$endif}: Ende des bedingten Blocks
Zweck: Moderne Syntax nur aktivieren bei Kompilierung mit FPC; der Delphi-Compiler überspringt diesen gesamten Block.
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}Code-Sprache: PHP (php)
Plattformübergreifende bedingte Kompilierung
MSWINDOWS: Gilt nur unter Windows-Betriebssystem{$apptype CONSOLE}: Legt das Programm als Konsolenanwendung fest (schwarzes Terminalfenster statt GUI-Fenster). Unter Linux/macOS wird diese Zeile ignoriert.
Kernwissen
stringnativer Basistyp; FPC/Delphi verwaltet den Speicher automatisch, manuelles Freigeben entfällt- procedure Prozedur: kein Rückgabewert; function Funktion: mit Rückgabewert, gespeichert in eingebauter Variable
Result - Unterschied Division:
/Gleitkommadivision;divGanzzahldivision (abschneiden) - Formatierte Ausgabe
Variable:Gesamtbreite:Nachkommastellenzur Steuerung der Gleitkommadarstellung - Parameterlose rekursive Funktionen benötigen leere Klammern
()zur Vermeidung von Mehrdeutigkeit Exit(Wert)gibt direkt einen Rückgabewert an und beendet die Funktion vorzeitig- Funktionen können ohne Auswertung des Rückgabewerts aufgerufen werden, geeignet für Nebeneffekte wie Änderung globaler Variablen
Regeln für Funktionsrückgabewerte
- Die eingebaute Sondervariable
Resultspeichert den Rückgabewert der Funktion, les- und schreibbar wie lokale Variablen
function MyFunction(const S: string): string;
begin
Result := S + 'One';
Result := Result + 'Two';
end;
Code-Sprache: PHP (php)
- Alte Schreibweise: Direkte Zuweisung an den Funktionsnamen (
MyFunction := xxx), unleserlich und nicht empfohlen, nutze einheitlichResult.
C/C++/Java/C# nutzen
=für Zuweisung und==für Gleichvergleich. Pascal arbeitet umgekehrt::=zur Variablenzuweisung, einfaches=zum Vergleich, passend zur mathematischen Notation.Pascal kennt keinen Operator
==
Ersetze die alte MyFunction im Beispiel durch obige Version. Diese Funktion hängt zuerst „One“, dann „Two“ an den übergebenen String an.
Der zurückgegebene String lautet: Originalstring + One + Two
Rekursive Aufrufe
Parameterlose Funktionen benötigen bei Rekursion leere Klammern (), um „Funktion aufrufen“ von „aktuellen Rückgabewert lesen“ abzugrenzen:
function SumIntegersUntilZero: Integer;
var I: Integer;
begin
ReadLn(I);
Result := I;
if I <> 0 then
Result := Result + SumIntegersUntilZero(); // rekursiver Aufruf mit ()
end;
Code-Sprache: JavaScript (javascript)
Erläuterung zur parameterlosen Funktion SumIntegersUntilZero:
SumIntegersUntilZero()→ Funktion ausführen, rekursieren und Rückgabewert holenSumIntegersUntilZero→ Zugriff auf interne VariableResult(eigener Rückgabewert der Funktion)
Code ohne Klammern:
Result := Result + SumIntegersUntilZero;
Der Compiler interpretiert es als:
Result := Result + Result;
Entspricht Result := Result * 2, die Rekursionslogik bricht vollständig ab, Endlosschleife und ständig verdoppelte Werte.
In diesem Beispiel ruft sich die Funktion solange selbst auf, bis die Eingabe 0 lautet; solange der Wert ungleich Null ist, läuft die Rekursion weiter.
Exit – vorzeitiges Verlassen
- Exit ohne Parameter: Sofortige Beendigung der Funktion, Rückgabe des bereits zugewiesenen Result-Werts
Exit(Wert): Direkte Angabe des Rückgabewerts und Funktionsende, entspricht return x aus C
function AddName(const ExistingNames, NewName: string): string;
begin
if ExistingNames = '' then
Exit(NewName); // Direkt NewName zurückgeben und abbrechen
Result := ExistingNames + ', ' + NewName;
end;
Code-Sprache: PHP (php)
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;
procedure MyProcedure(const A: Integer);
begin
WriteLn('A + 10 is: ', A + 10);
end;
function AddName(const ExistingNames, NewName: string): string;
begin
if ExistingNames = '' then
Exit(NewName);
Result := ExistingNames + ', ' + NewName;
end;
var
X: Single;
begin
WriteLn(AddName('Tom','Jack'));
WriteLn(AddName('Tom',''));
WriteLn(AddName('','Jack'));
end.Code-Sprache: PHP (php)
Funktionen wie Prozeduren aufrufen (Rückgabewert ignorieren)
Funktionen mit Rückgabewert können nur zur Ausführung ihrer Logik aufgerufen werden, ohne das Ergebnis zu speichern; geeignet für Nebeneffekte wie Änderung globaler Variablen:
var
Count, MyCount: Integer;
function CountMe: Integer;
begin
Inc(Count); // Nebeneffekt: Globale Variable um 1 erhöhen
Result := Count;
end;
begin
Count := 10;
CountMe; // Rückgabewert verwerfen, nur Logik läuft, Count wird 11
MyCount := CountMe; // Rückgabewert speichern, Count wird 12
end.
Code-Sprache: PHP (php)
Vollständiges lauffähiges Beispiel
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;
var
Count, MyCount: Integer;
function CountMe: Integer;
begin
Inc(Count);
Result := Count;
end;
begin
Count := 10;
WriteLn(CountMe);
MyCount := CountMe;
WriteLn(MyCount);
end.Code-Sprache: PHP (php)
Inc ist eingebaute Standardfunktion von Pascal (FPC/Delphi), erhöht eine Variable um 1.
var ist das Variablendeklarationsschlüsselwort von Pascal, dient zur Definition von Variablen.
var
Count, MyCount: Integer;Code-Sprache: JavaScript (javascript)
var: Beginnt den Variablendeklarationsbereich
Count, MyCount: Zwei Variablennamen
Integer: Ganzzahltyp
Die im var-Block dieses Beispiels deklarierten Variablen sind global, in allen Prozeduren und Funktionen des gesamten Programms nutzbar.
Funktionen, Prozeduren und primitive Basistypen