[Solved] array of record Frage

Für Fragen von Einsteigern und Programmieranfängern...
sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

[Solved] array of record Frage

Beitrag von sstvmaster »

Hi, ich wollte so was machen.

Code: Alles auswählen

type
  TStation = record
    Call: string;
    Location: string;
    OP: string;
    ST: byte; // start time
  end;

var
  VStations: array[0..17] of TStation = (
    ('4u1un', 'United Nations', 'UNRC', 0 ),
    ('ve8at', 'Canada', 'RAC/NARC', 10 ),
    ('w6wx', 'United States', 'NCDXF', 20 ),
    ('kh6rs', 'Hawaii', 'MARC', 30 ),
    ('zl6b', 'New Zealand', 'NZART', 40 ),
    ('vk6rbp', 'Australia', 'WIA', 50 ),
    ('ja2igy', 'Japan', 'JARL', 60 ),
    ('rr9o', 'Russia', 'SRR', 70 ),
    ('vr2b', 'Hong Kong', 'HARTS', 80 ),
    ('4s7b', 'Sri Lanka', 'RSSL', 90 ),
    ('zs6dn', 'South Africa', 'ZS6DN', 100 ),
    ('5z4b', 'Kenya', 'ARSK', 110 ),
    ('4x6tu', 'Israel', 'IARC', 120 ),
    ('oh2b', 'Finland', 'SRAL', 130 ),
    ('cs3b', 'Madeira', 'ARRM', 140 ),
    ('lu4aa', 'Argentina', 'RCA', 150 ),
    ('oa4b', 'Peru', 'RCP', 160 ),
    ('yv5b', 'Venezuela', 'RCV', 170 )
  );
geht natürlich nicht.
bacons.lpr(16,6) Fatal: Syntax error, "identifier" expected but "const string" found
das geht aber:

Code: Alles auswählen

VStations: array[0..17] of TStation = (
    (Call: '4u1un'; Location: 'United Nations'; OP: 'UNRC'; ST: 0 ),
    ...
Warum muss man den Identifier immer mit schreiben?
Geht das auch anders?
Zuletzt geändert von sstvmaster am Fr 23. Okt 2020, 10:55, insgesamt 1-mal geändert.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: array of record Frage

Beitrag von Winni »

Hi!

Beim array of record müssen immer die einzelnen Felder identifiziert werden.
Finde ich auch umständlich.
Selbst bei solch einfachen Sachen wie einem array of TPoint musst Du
x und y identifizieren.

Das was schon in Turbo-Zeiten so.
Ohne geht das nur beim einem Array of SimpleType:

Farben : array[0..2] of string = ('rot','gruen','blau');

Warum das so ist: Bitte frag die Compiler-Konstrukteure.
Hier ist fast täglich einer unterwegs.

Winni

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: array of record Frage

Beitrag von Socke »

Winni hat geschrieben:
Do 22. Okt 2020, 11:44
Warum das so ist: Bitte frag die Compiler-Konstrukteure.
Füge deinem Record ein Feld hinzu und du weißt warum ;-)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

PascalDragon
Beiträge: 829
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: array of record Frage

Beitrag von PascalDragon »

Socke hat geschrieben:
Do 22. Okt 2020, 12:14
Winni hat geschrieben:
Do 22. Okt 2020, 11:44
Warum das so ist: Bitte frag die Compiler-Konstrukteure.
Füge deinem Record ein Feld hinzu und du weißt warum ;-)
Genau. Das ist auch der Grund, warum neuere C- und C++-Standards das auch hinzugefügt haben (wobei GCC das schon lange unterstützt). Die verbliebenen Felder werden nämlich auf "0" initialisiert (und der Rest verschiebt sich einfach) und das kann dann unangenehme Seiteneffekte haben und schwer zu debuggen sein (und ja, mich hat sowas schon mal betroffen).

Es mag also mehr Schreibaufwand sein, aber es zeichnet sich durch Sicherheit aus - wie vieles bei Pascal.
FPC Compiler Entwickler

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: array of record Frage

Beitrag von fliegermichl »

PascalDragon hat geschrieben:
Do 22. Okt 2020, 13:40
Es mag also mehr Schreibaufwand sein, aber es zeichnet sich durch Sicherheit aus - wie vieles bei Pascal.
Hm das mag schon sein. Ich denke doch aber, daß der Compiler rausbekommen kann, wieviele Felder der Record hat und von welchem Typ die sind.
Bei Varianten Records gebe ich dir Recht aber bei so einfachen?.

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: array of record Frage

Beitrag von Sieben »

Das ist doch gerade der Witz an dieser Sprache, dass hier keine Ratespielchen veranstaltet werden, was der Programmierer wahrscheinlich oder vielleicht gemeint haben könnte, sondern möglichst strikt nur das gemacht wird, was er explizit angewiesen hat. Das ist für meinen Geschmack ohnehin schon ziemlich verwässert worden.

Mit der anderen Variante spart man sich vielleicht und wie schon gesagt ein bisschen Schreibarbeit, hat dann aber die lustigen Überraschungen zur Laufzeit.

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

Re: array of record Frage

Beitrag von Mathias »

Wen ihr mal eine anständige Konstante sehen wollt, habe ich hier etwas. 😉

https://github.com/sechshelme/Lazarus-E ... _const.pas
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: array of record Frage

Beitrag von af0815 »

Wenn die erste Zeile nicht wäre, so wäre es echt beeindruckend. SCNR
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: array of record Frage

Beitrag von fliegermichl »

:-)

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

Re: array of record Frage

Beitrag von Mathias »

af0815 hat geschrieben:
Do 22. Okt 2020, 18:06
Wenn die erste Zeile nicht wäre, so wäre es echt beeindruckend. SCNR
Die einfachste Variante, wen man keine INI Dateien will.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 829
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: array of record Frage

Beitrag von PascalDragon »

fliegermichl hat geschrieben:
Do 22. Okt 2020, 14:01
PascalDragon hat geschrieben:
Do 22. Okt 2020, 13:40
Es mag also mehr Schreibaufwand sein, aber es zeichnet sich durch Sicherheit aus - wie vieles bei Pascal.
Hm das mag schon sein. Ich denke doch aber, daß der Compiler rausbekommen kann, wieviele Felder der Record hat und von welchem Typ die sind.
Bei Varianten Records gebe ich dir Recht aber bei so einfachen?.
Es braucht keine Varianten Records. Nimm das folgende, recht dumme Beispiel:

Code: Alles auswählen

type
  TPerson = record
    Name: String;
    City: String;
  end;
  
 const
   Persons: array of TPerson = (
     ( Name: 'Max Mustermann' ; City: 'Musterstadt'),
     ( Name: 'Erika Musterfrau'; City: 'Musterstadt')
   ); 
Nun nimm mal an du trennst Name in FirstName und LastName auf, vergisst aber die Konstante anzupassen (vielleicht weil du abgelenkt wurdest und es dann vergessen hast - passiert mir oft genug - oder vergessen hast, dass die Konstante überhaupt existiert - kann in größeren Projekten vorkommen). Mit den benannten Feldern wird der Compiler meckern bzw. zumindest warnen (wenn sich keine Feldnamen geändert haben), hättest du aber Record Konstanten ohne Feldnamen würde das passieren:

Code: Alles auswählen

type
  TPerson = record
    FirstName: String;
    LastName: String;
    City: String;
  end;
  
const
   Persons: array of TPerson = (
     ( 'Max Mustermann' ; 'Musterstadt'),
     ( 'Erika Musterfrau'; 'Musterstadt')
   ); 
Nun sind in der Konstante die Felder FirstName und LastName gefüllt, aber City ist leer. Gut, sowas dürfte recht leicht auffallen, aber habe hier mal zum Beispiel numerische Felder, wo es nicht so leicht ist zu sagen, ob die Zahl nun so richtig ist oder nicht.

Pascal geht hier eben einfach den Weg, der dir am wenigsten ins Knie schießt.
FPC Compiler Entwickler

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: array of record Frage

Beitrag von sstvmaster »

Hallo Leute,

vielen Dank für eure Erklärungen und Beispiele, warum, wieso, weshalb das so gemacht werden muss.

Das hat mir sehr geholfen.

LG Maik
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: [Solved] array of record Frage

Beitrag von sstvmaster »

Nachtrag: wäre das nicht auch was für das Wiki?

Array of record gibt es nicht, oder ich bin blind.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: [Solved] array of record Frage

Beitrag von wp_xyz »

Falls du dich auf das "Persons: array of TPerson" von PascalDragon beziehst: Das gibt es sein FPC 3.2 (https://wiki.freepascal.org/FPC_New_Fea ... ialization).

Folgender Code compiliert mit 3.2, aber nicht mit 3.0.4:

Code: Alles auswählen

program Project1;

type
  TPerson = record
    Name: String;
    City: String;
  end;

 const
   Persons: array of TPerson = (
     ( Name: 'Max Mustermann' ; City: 'Musterstadt'),
     ( Name: 'Erika Musterfrau'; City: 'Musterstadt')
   );

var
  p: TPerson;
begin
  for p in Persons do
    WriteLn(p.Name, ' in ', p.City);

  ReadLn;
end.  

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: [Solved] array of record Frage

Beitrag von Socke »

sstvmaster hat geschrieben:
Fr 23. Okt 2020, 11:56
Nachtrag: wäre das nicht auch was für das Wiki?
Ich habe es mal hier ergänzt: https://wiki.freepascal.org/Record#Constant_record
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten