Results 1 to 9 of 9

Thread: Dynamische array constante declaratie

  1. #1
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382

    Dynamische array constante declaratie

    Het is mij opgevallen dat er nogal wat lijkt te schorten aan de constante array decaraties in Delphi. Soms met catastrofale gevolgen.
    Array declaraties met een statische lengte gaan wel altijd goed.

    Code:
    const
      ObjectTypes: TArray<TClass> = [TObject, TComponent];
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
      c: TClass;
    begin
      for c in ObjectTypes do
        ShowMessage(c.ClassName); // crash (gemeld bij Embarcadero)
    end;
    Of soms lijkt het syntactisch onmogelijk:

    Code:
    type
      TTest = record
        Field: string;
        Sample: Integer;
      end;
    
    const
      TestArray: TArray<TTest> = [
        // how on earth doen we dit?
      ];

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    (field:'1';sample:5),(field:'2';sample:7) enz? oftewel de syntax van normale (niet dyn array) constante declaraties?

  3. #3
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Nee dus, helaas... strange...

  4. #4
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Ik heb (eigenlijk vreemd genoeg sinds het nu toch al een tijd bestaat) helemaal geen ervaring met generics (van die sub-types met <>) maar constante declaraties van records was met accolades als ik het me juist herinner:

    {field:'x';sample:5}

  5. #5
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Nee het gaat erom dat syntax vreemd is. Anders dan bij een statische array.

    Dit werkt wel (ronde haken).
    Code:
    const
      TestArray: array[0..0] of TTest = (
        (Field: 'a'; Sample: 1)
      );
    Waarom niet ook gewoon ronde haakjes net als hierboven?
    Code:
    const
      TestArray: TArray<TTest> = (
        (Field: 'a'; Sample: 1)
      );

  6. #6
    Stijn Sanders develyoy's Avatar
    Join Date
    Jun 2008
    Location
    GentBrugge, Belgi?½
    Posts
    1,046
    Wat voor iets is TArray zelf? Als het een afgeleide van TObject is, is het mogelijk dat dat niet kan omdat er vanuit imperatieve code ergens eerst een constructor moet worden aangeroepen vóór je data in het object kan aanbrengen. En dat zou kunnen verklaren waarom het dan niet vanuit constante notatie kan.

  7. #7
    Je moet bij een constante array de dimensies opgeven. Dat moet ook als het geen generic array is.

    Ik vraag me trouwens wel af wat nou het voordeel is van TArray<T>. Het was tenslotte al strongly typed met array of T..
    1+1=b

  8. #8
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Enige voordeel van TArray<Integer> dat ik kan bedenken is dat je hem zonder meer als property kan gebruiken omdat het al een type is.
    Verder is het (denk ik, hoop ik) absoluut gelijk aan array of Integer;

    Code:
    const
      MyArray1: TArray<Integer> = [0, 1, 2, 3];
      MyArray2: array of Integer = [0, 1, 2, 3];
      MyArray3: array[0..3] of Integer = (0, 1, 2, 3);

  9. #9
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    Quote Originally Posted by EricLang View Post
    Het is mij opgevallen dat er nogal wat lijkt te schorten aan de constante array decaraties in Delphi. Soms met catastrofale gevolgen.
    Array declaraties met een statische lengte gaan wel altijd goed.

    Code:
    const
      ObjectTypes: TArray<TClass> = [TObject, TComponent];
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
      c: TClass;
    begin
      for c in ObjectTypes do
        ShowMessage(c.ClassName); // crash (gemeld bij Embarcadero)
    end;
    Of soms lijkt het syntactisch onmogelijk:

    Code:
    type
      TTest = record
        Field: string;
        Sample: Integer;
      end;
    
    const
      TestArray: TArray<TTest> = [
        // how on earth doen we dit?
      ];
    Beide issues werken gewoon in FreePascal
    Code:
    {$mode delphi}
    uses classes;
    const
      TestArray: TArray<integer> = [
        // how on earth doen we dit? Freepascal gebruiken
      ];
     
    const
      ObjectTypes: TArray<TClass> = [TObject, TComponent];
    
    procedure dotest;
    var
      c: TClass;
    begin
      for c in ObjectTypes do
        writeln(c.ClassName); // Geen crash in FreePascal....
    end; 
    begin
      dotest;
    end.
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

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
  •