Results 1 to 11 of 11

Thread: Records uit een bestand lezen - syntax error

  1. #1

    Records uit een bestand lezen - syntax error

    Hallo iedereen,

    Ik ben nog maar een klein eindje bezig met pascal code aan te leren en ben momenteel nog bezig aan de beginners code
    Momenteel ben ik bezig met een programma te schrijven in Structorizer en heb die dan overgezet naar pascal/delphi code.
    Het probleem is nu dat als ik die code probeerde te compilen ik een aantal errors kreeg waarvan ik de meeste al heb kunnen wegwerken. *yay voor mezelf *

    Er is echter nog 1 syntax error achtergebleven en ik kan voor mn leven niet achterhalen hoe ik die eruit moet krijgen :s
    Zou er zo iemand zo vriendelijk willen zijn mij een handje te helpen hiermee?
    Gelieve wel de code simplistisch te houden, de verbeterde code versie begrijp ik nog niet echt....

    Code:
    { Generated by Structorizer 3.26-05 }
    program Personeelslijst;
    
    {$mode objfpc}
    
    begin
      type personeel = record
      nr : integer;
      naam, adres, postcode, plaats : string;
      wedde : integer;
      end;
    
    var
      { TODO: check and accomplish variable declarations }
      persoon: personeel;
      f: file of personeel;
      bestandsnaam: string;
    
    writeln('Geef de bestandsnaam.');
    readln(bestandsnaam);
    ASSIGN(f, bestandsnaam);
    RESET(f);
    while not (EOF(f)) do
    begin
      read(f, persoon);
      writeln(persoon.naam:20, ' ', persoon.adres:20, ' ', persoon.postcode:4, ' ', persoon.plaats:20);
    end;
    CLOSE(f);
    writeln;
    writeln('ENTER');
    readln();
    end.

    Het onderlijnde en vetgedrukte stukje code is waar ik deze syntax error krijg :

    Compile Project, Target: Personeelslijst.exe: Exit code 1, Errors: 2
    Personeelslijst.pas(7,3) Error: Illegal expression
    Personeelslijst.pas(7,8) Fatal: Syntax error, ";" expected but "identifier PERSONEEL" found

    Groeten,
    Haraldur

  2. #2
    Zou je je type en var gedeelte niet boven begin zetten?! Ik denk dat daar je fout zit.

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    zoals Reidinga zei:
    Delphi Code:
    1. type
    2.  
    3. end;
    4.  
    5. var
    6.  
    7. begin
    8.  
    9. end;
    Delphi is great. Lazarus is more powerfull

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Wanneer je de "begin" verplaatst naar de regel vlak boven "var", dan zou het moeten kloppen.
    Daarnaast schrijven Pascal-conventies voor dat gedeclareerde types vooraf worden gegaan met
    een hoofdletter "T", in jouw geval wordt het dus "TPersoneel".

    Verder zou ik, anders weet "ReadLn()" niet hoe groot TPersoneel is, de strings in het record
    als shortstring declareren:

    Delphi Code:
    1. type
    2.   TPersoneel = record
    3.     Nr: Integer;
    4.     Naam: string[20];
    5.     Adres: string[20];
    6.     Postcode: string[4];
    7.     Plaats: string[20];
    8.     Wedde: Integer;
    9.   end;
    Last edited by VideoRipper; 23-Apr-17 at 01:38.
    TMemoryLeak.Create(Nil);

  5. #5
    Quote Originally Posted by VideoRipper View Post
    Verder zou ik, anders weet "ReadLn()" niet hoe groot TPersoneel is, de strings in het record
    als shortstring declareren
    Sterker nog, in modernere Delphi versies en Lazarus/fpc compileert dat (f: file of personeel niet eens als je record managed types (zoals ansistrings) bevat.

    Daarnaast zou ik het record declareren als "packed", zodat de layout onafhankelijk is van je CPU en je recordgrootte dus altijd hetzelfde is.
    Scheelt weer onbegrijpelijke crashes als je standaard integer type opeens geen 32-bit meer is.

    Bart

  6. #6
    @Reidinga, jkuiper & Videoripper

    Bedankt voor de info! Heb het eindelijk werkend gekregen en begrijp nu ook eindelijk waar het probleem zat
    Het was inderdaad gewoon de "begin;" die tekort was onder de var declaratie waardoor het niet wilde werken!

    Dat ik dat niet gezien heb zeg >.>

    @Bart B

    Dat is nog net iets te ver gevorderd voor me op het ogenblik

    Maar het is wel interessant om te weten dat als je een record declareert als packed dat het een vaste recordgrootte aanhoudt, onafhankelijk van welke pc het op gedraaid wordt!



    Bedankt voor de info iedereen

    Haraldur

  7. #7
    Quote Originally Posted by Haraldur View Post
    @Bart B

    Dat is nog net iets te ver gevorderd voor me op het ogenblik
    Delphi Code:
    1. type
    2.   personeel = packed record
    3.     nr : integer;
    4.     naam, adres, postcode, plaats : shortstring;
    5.     wedde : integer;
    6.   end;

    Zo simpel is het.
    Gewoon doen, anders krijg je in de toekomst problemen met deze code.

    (Voor de toekomst, als je zelf wat verder "gevorderd" bent (komt vanzelf als je nieuwsgierig blijft en blijft programmeren): nog beter is natuurlijk om deze gegevens niet in een propriëtair (zelf-bedacht) bestandsformaat op te slaan, maar of wel in een (gangbare) database of bijv in XML. In dat laatste geval kun je ook weer ansistrings (of widestrings) gebruiken voor naam, adres etc. en heb je dus geen limiet meer van 255 tekens.)

    Bart

  8. #8
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Quote Originally Posted by videoripper
    Verder zou ik, anders weet "ReadLn()" niet hoe groot TPersoneel is, de strings in het record als shortstring declareren:

    Delphi Code:

    type
    TPersoneel = record
    Nr: Integer;
    Naam: string[20];
    Adres: string[20];
    Postcode: string[4];
    Plaats: string[20];
    Wedde: Integer;
    end;
    Quote Originally Posted by Bart B
    Sterker nog, in modernere Delphi versies en Lazarus/fpc compileert dat (f: file of personeel niet eens als je record managed types (zoals ansistrings) bevat.

    type
    personeel = packed record
    nr : integer;
    naam, adres, postcode, plaats : shortstring;
    wedde : integer;
    end;
    Wat is er mis mee om een string declaratie te gebruiken i.p.v. shortstring? De string declaratie is toch niet meer dan een springpointerververwijzing. en je kan gebruik maken van Unicode / UTF8.
    Delphi Code:
    1. type
    2.       TPersoneel = packed record
    3.         Nr: Integer;
    4.         Naam: string;     //pointer
    5.         Adres: string;     //pointer
    6.         Postcode: string; //pointer
    7.         Plaats: string;     //pointer
    8.         Wedde: Integer;
    9.       end;
    Delphi is great. Lazarus is more powerfull

  9. #9
    Quote Originally Posted by jkuiper View Post
    Wat is er mis mee om een string declaratie te gebruiken i.p.v. shortstring? De string declaratie is toch niet meer dan een springpointerververwijzing. en je kan gebruik maken van Unicode / UTF8.
    De bedoeling was om dit record met een "file of personeel" naar een bestand weg te schrijven. (Zie openingspost) Met een string declaratie ga je dan pointers naar het geheugen wegschrijven naar een bestand. Lijkt mij niet echt nuttig

  10. #10
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Oeps. dat is is waar. Maar ik weet ook dat Delphi met shortstring gebruik maakt van ansistring en dat unicode karakters genegeerd worden en dus dataverlies kan krijgen of tekens helemaal niet zien zoals ze zijn uitgevoerd. Dan maar, zoals Bart zegt, gebruik maken van XML
    Delphi is great. Lazarus is more powerfull

  11. #11
    We zitten hier in het Lazarus subforum dus wat Delphi doet is natuurlijk niet zo interessant (tenzij je ooit naar Delphi over wilt stappen wat mij niet logisch lijkt)
    Ik zou overigens geen shortstring gebruiken maar zoals al eerder genoemd string[x] (waar x de maximale lengte is, in raw utf8).

    XML zou inderdaad een optie kunnen zijn maar dan moet je daar wel je design op aanpassen. Een "file of personeel" heeft weer wel als voordeel dat het direct het 3e personeelslid uit het bestand kan lezen en updaten zonder de hele file te moeten lezen en schrijven. Als je dan naar een ander "formaat" gaat kun je i.p.v. XML net zo goed direct naar SQLite gaan.

    Maar nogmaals... dat hangt allemaal af van je design.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •