Dieser Code funktioniert zumindest mit FPC 3.3.
Code: Alles auswählen
program Project1;
{$zerobasedstrings on}
var
s: string = 'Hello World';
i: integer;
begin
for i := 0 to Length(s) - 1 do begin
Write(s[i]);
end;
WriteLn();
end
Code: Alles auswählen
program Project1;
{$zerobasedstrings on}
var
s: string = 'Hello World';
i: integer;
begin
for i := 0 to Length(s) - 1 do begin
Write(s[i]);
end;
WriteLn();
end
Genau so ist es. Das mit dem beginnenden [0] hätte man mit dem AnsiString einführen müssen, als auch die dynamischen Array raus kamen.Der Typ String wurde 1983 von Turbo Pascal eingeführt, damals zunächst als ShortString, wobei das erste Byte das Längenbyte ist (zuvor Array of Char ohne flexible Länge).
Das heißt, dass der Zeichen-Zugriff im String-Typ bisher immer Index-1-basiert war - und das jetzt seit über 40 Jahren!
Code: Alles auswählen
var
a: array[8] of char;
var
a: array[0..7] of char;
Du willst mehr Missverständlichkeit um dadurch drei Zeichen zu sparen...Mathias hat geschrieben: Mo 7. Apr 2025, 13:08 Was mir noch ein sympatisches Features wäre, wen ein statisches array nicht immer ein ".." bräuchte, wen es mit 0 beginnt.
[JOKE ON] Hast dich C schon so verseucht [JOKE OFF]Mathias hat geschrieben: Mo 7. Apr 2025, 13:08 Was mir noch ein sympatisches Features wäre, wen ein statisches array nicht immer ein ".." bräuchte, wen es mit 0 beginnt.
Code: Alles auswählen
var
s: string[16];
Genau, es kommt mit gerade keine andere Sprache in den Sinn welche ".." braucht.[JOKE ON] Hast dich C schon so verseucht [JOKE OFF]
Das liegt aber daran das Arrays in Pascal fundamental immer Assoziative Arrays sind. Also eigentlich Mappings von einem Typen auf einen anderen.Mathias hat geschrieben: Mo 7. Apr 2025, 13:45 Genau, es kommt mit gerade keine andere Sprache in den Sinn welche ".." braucht.
Code: Alles auswählen
arr: Array[0..9] of Integer;
// Ist das gleiche wie
type T10Elems=0..9;
var
arr: Array[T10Elems] of Integer;
Dem widerspreche ich. Pascal hat einen ordinalen Array-Index. Das hat wenig mit Assoziation sondern mehr mit Typumwandlung zu tun. Du kannst z.B. keine Strings, Pointer oder Arrays als Index verwenden, was bei echten assoziativen Arrays der Fall ist.Warf hat geschrieben: Mo 7. Apr 2025, 21:50Das liegt aber daran das Arrays in Pascal fundamental immer Assoziative Arrays sind. Also eigentlich Mappings von einem Typen auf einen anderen.Mathias hat geschrieben: Mo 7. Apr 2025, 13:45 Genau, es kommt mit gerade keine andere Sprache in den Sinn welche ".." braucht.
Das ist eine technische limitation, keine limitation auf Sprachebene. Wenn morgen ein FPC Update käme was transparent komplexe Datentypen bei arrays als hashmap abbilden würde, würde sich an der Sprachdefinition absolut nix ändern.Socke hat geschrieben: Di 8. Apr 2025, 09:54 Dem widerspreche ich. Pascal hat einen ordinalen Array-Index. Das hat wenig mit Assoziation sondern mehr mit Typumwandlung zu tun. Du kannst z.B. keine Strings, Pointer oder Arrays als Index verwenden, was bei echten assoziativen Arrays der Fall ist.
...
Wenn du Assoziationen nutzen willst, musst auf Maps, Hash Listen etc. umschwenken. Diese verwalten die Daten dann als Arrays, verkettete Listen oder Bäume.
Code: Alles auswählen
array[<TypeDecl List>] of <TypeDecl>
Nicht ganz, bei booleans ist's 0 und 1 und bei longbool und Konsorten ist's 0 und -1 da bei letzteren logisches und bitweises Not identisch sind, während beim ersten erlaubt mit dem Ergebnis von vergleichen zu rechen und damit geht z.B. das folgende:Bei Boolean gibt es fixe Werte (False = 0, True = -1).
Code: Alles auswählen
sign := ord(x>=0)*2-1
Tatsächlich haben die Free Pascal Entwickler, eine andere Definition dokumentiert: https://www.freepascal.org/docs-html/cu ... 500003.3.1Warf hat geschrieben: Di 8. Apr 2025, 14:39 Arrays sind definiert alsDas technisch das ganze nur umgesetzt ist für ordinal Typen ändert semantisch nix daran das es ein mapping von Typen auf Typen ist.Code: Alles auswählen
array[<TypeDecl List>] of <TypeDecl>