Autor Téma: Generika a číselné typy  (Přečteno 172 krát)

Offline PetrB0

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo
Generika a číselné typy
« kdy: 31-07-2020, 16:57:28 »
Ahoj,
řeším drobný zádrhel s generiky. Mám následující kód
Kód: [Vybrat]
unit TestGen;

interface
Type
    TVektor<T> = Class
                  private
                   pObsah    : Array Of T;
                  public
                  Procedure Zapocti(Const VHodnota : T);
                 End;
implementation

{ TVektor<T> }

procedure TVektor<T>.Zapocti(const VHodnota: T);
Var
   __I : Integer;
begin
 for __I := Low(pObsah) to High(pObsah) do
  pObsah[__I]:=pObsah[__I]+VHodnota;
end;

end.
Který mi Delphi 10.2 nepřeloží a vrátí chybu (u řádku pObsah[__I]:=...)
Operator not applicable to this operand type.
Já vím, že T bude jenom číselný typ (double nebo Integer). Pro ten by se to patrně přeložilo, ale jak to kompilátoru sdělit?
Máte nějaký typ?

Díky

Pb

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2840
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Generika a číselné typy
« Odpověď #1 kdy: 31-07-2020, 18:49:25 »
    TVektor<T> = Class
Dela se to pomoci tzv. constraints viz http://docwiki.embarcadero.com/RADStudio/Sydney/en/Constraints_in_Generics tj. nejak musis vymyslet
Kód: [Vybrat]
    TVektor<T: TMyType> = Class

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Generika a číselné typy
« Odpověď #2 kdy: 31-07-2020, 19:33:47 »
Okrem toho že T predstavuje "class" či nejaký typ, tak ja by som namiesto poľa Array of T... tak isto použil generikum. Kto sa má potom starať o veľkosť poľa?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline PetrB0

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo
Re:Generika a číselné typy
« Odpověď #3 kdy: 31-07-2020, 20:38:53 »
Okrem toho že T predstavuje "class" či nejaký typ, tak ja by som namiesto poľa Array of T... tak isto použil generikum. Kto sa má potom starať o veľkosť poľa?
Ten "management" okolo velikost pole mám v jiných metodách, to je v pohodě. Jde mi jenom čistě o tuto metodu pro počítání.

Offline PetrB0

  • Mladík
  • **
  • Příspěvků: 64
  • Karma: 1
    • Verze Delphi: Delphi XE2, Delphi 10.2 Tokyo
Re:Generika a číselné typy
« Odpověď #4 kdy: 31-07-2020, 20:42:03 »
    TVektor<T> = Class
Dela se to pomoci tzv. constraints viz http://docwiki.embarcadero.com/RADStudio/Sydney/en/Constraints_in_Generics tj. nejak musis vymyslet
Kód: [Vybrat]
    TVektor<T: TMyType> = Class

Jo, to jsem tak nějak tušil, ale mám obavu že obecný TNumericType (předek všech číselných typů) neexistuje. ;-)
No, patrně se na to vybodnu a udělám to všechno jako double. Bude to cca pět polí o 400 prvcích, které potřebují double a jedno o 400 prvcích, kde by stačilo Integer.

Díky

Pb

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Generika a číselné typy
« Odpověď #5 kdy: 31-07-2020, 21:04:10 »
Ale napr. Tlist<Integer> funguje bez problémov. Je to uvedené aj v príkladoch. Tak isto bude fungovať aj Double.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5124
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Generika a číselné typy
« Odpověď #6 kdy: 31-07-2020, 21:05:34 »
Okrem toho že T predstavuje "class" či nejaký typ, tak ja by som namiesto poľa Array of T... tak isto použil generikum. Kto sa má potom starať o veľkosť poľa?
Ten "management" okolo velikost pole mám v jiných metodách, to je v pohodě. Jde mi jenom čistě o tuto metodu pro počítání.
Nebolo by pekné ho vyhodiť?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2840
  • Karma: 134
    • Verze Delphi: D2007, XE3, DX10
Re:Generika a číselné typy
« Odpověď #7 kdy: 31-07-2020, 21:20:54 »
Jo, to jsem tak nějak tušil, ale mám obavu že obecný TNumericType (předek všech číselných typů) neexistuje. ;-)
No, musel by sis z toho udelat treba variantni record nebo objekt, samozrejme ze spolecny predek pro ordinalni a float typy neexistuje.