Autor Téma: Konštanty - ako s nimi narába kompilátor.  (Přečteno 262 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Konštanty - ako s nimi narába kompilátor.
« kdy: 07-12-2018, 09:17:44 »
Nepodarilo sa mi k tomu nič nájsť.
Kód: Delphi [Vybrat]
  1.  
  2. Verzia 1
  3. procedure...
  4. const
  5.   coFlatNumber = 0;
  6. var
  7.   NodeData: POwnerData;
  8. begin
  9.   NodeData := Sender.GetNodeData(Node);
  10.   case Column of
  11.     coFlatNumber: CellText := IntToStr(NodeData.FlatNumber);
  12.     ...
  13. Verzia 2
  14. implementation
  15. const
  16.   coFlatNumber = 0;
  17. ...
  18.  
  19. procedure
  20. var
  21.   NodeData: POwnerData;
  22. begin
  23.   NodeData := Sender.GetNodeData(Node);
  24.   case Column of
  25.     coFlatNumber: CellText := IntToStr(NodeData.FlatNumber);
Mňa zaujíma výsledný kód po skompilovaní. A to či to nechá v pôvodnom stave, alebo to pretransfromuje do tejto podoby
Kód: Delphi [Vybrat]
  1. Verzia 1
  2. procedure...
  3. var
  4.   NodeData: POwnerData;
  5. begin
  6.   NodeData := Sender.GetNodeData(Node);
  7.   case Column of
  8.     0: CellText := IntToStr(NodeData.FlatNumber);
Pýtam sa to kvôli miestu, kde budem definovať opakujúce sa konštanty. Ak to kompilátor pretransformuje podľa ukážky, tak dám prednosť definovaniu konštát v mieste použitia. Áno, budem ich opakovať a zväčším počet riadkov jednotky. Ale mám to priamo na očiach a zmena nebude robiť problém.


Pri definovaní konštát v implementation môže byť ten zoznam nepríjemne dlhý. Pritom sa mi jednotlivé názvy môžu, aj sa, opakovať. V tom prípade musím použiť maďarsku notáciu a už sa v tom nevyznám.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #1 kdy: 07-12-2018, 09:37:14 »
Opakování definice konstant bych se určitě snažil vyhnout - pokud se budou definice opakovat, skoro bych se vsadil, že dřív nebo později budou ty konstanty na různých místech definované různě :-)

Nešlo by je všechny vyčlenit třeba do jednotky Konstanty.pas a tu pak jen dávat do uses?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #2 kdy: 07-12-2018, 09:46:39 »

Citace
pokud se budou definice opakovat, skoro bych se vsadil, že dřív nebo později budou ty konstanty na různých místech definované různě :-)
To by som zrovna za chybu nepovažoval. Lebo sú lokálne a vystihujú svoj účel.

Tých konštán je trocha priveľa. A vždy sú iné, alebo pri rovnakom názve majú inú hodnotu. Typicky "Title". To používam všeobecne pre akýkoľvek názov či meno. Dôvodom ich použitia je nemať magické čísla. Ide mi hlavne o VirtualStringTree. Opakujú sa tam väčšinou na troch miestach:
onCompareNodes
onGetText
onIncrementalSearch

Ich počet závisí od počtu stĺpcov vo VST.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #3 kdy: 07-12-2018, 09:52:18 »
Ešte som zabudol, že ak to kompilátor ponechá v pôvodnej podbobe, tak ich pri behu programu bude stále dookola vytvárať. Ak to pretransformuje podľa príkladu, tak sa nič také nebude diať. Ide aj o šetrenie systémových prostriedkov.

A to bol hlavný dôvod pre vytvorenie tohto príspevku :)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #4 kdy: 07-12-2018, 09:54:27 »
Kompilátor při překladu použije tu skutečnou hodnotu, takže žádná režie s vytvářením konstant za běhu není.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #5 kdy: 07-12-2018, 10:03:19 »
To som chcel vedieť. Akosi som to tušil - tlačila ma do toho logika. Ďakujem.
V tom prípade radšej použijem lokálne (ukecané) definovanie konštánt. Nebudem mať problémy v budúcnosti.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2331
  • Karma: 125
    • Verze Delphi: D2007, XE3, DX10
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #6 kdy: 07-12-2018, 11:39:47 »
použitia je nemať magické čísla. Ide mi hlavne o VirtualStringTree. Opakujú sa tam väčšinou na troch miestach:
onCompareNodes
onGetText
onIncrementalSearch

Ich počet závisí od počtu stĺpcov vo VST.
Ty konstanty jsou spolecne pro vsechny metody daneho VTV, ne? Pak maji byt definovane na urovni VTV. Takze za me je spravne reseni:
- nepouzivat archaicke constanty a madarskou notaci a buhvi co
- nahradit to scoped enums ({$SCOPEDENUMS ON}) na urovni VTV, ke kteremu se to vztahuje tj. mam-li core jmeno VTV napr. MujTreeView tak bych definoval
Kód: Delphi [Vybrat]
  1. type
  2.   EMujTreeViewColumns = (FlatNumber, ... )
a pouziti by bylo
Kód: Delphi [Vybrat]
  1. case Column of
  2.   EMujTreeViewColumns.FlatNumber: ....;
  3.   ...
  4. end;

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #7 kdy: 07-12-2018, 13:22:08 »
A keď tam mám niečo na preskáčku? To znamená, nemám súvislý číselný rad. Ako to riešiť? Napr. FlatNumber = 3.
Kód: Delphi [Vybrat]
  1. EMujTreeViewColumns = (?, ?, ?, FlatNumber, ... )
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1364
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #8 kdy: 07-12-2018, 13:29:48 »
A keď tam mám niečo na preskáčku? To znamená, nemám súvislý číselný rad. Ako to riešiť? Napr. FlatNumber = 3.
Kód: Delphi [Vybrat]
  1. EMujTreeViewColumns = (?, ?, ?, FlatNumber, ... )

Viz. Enumerated Types with Explicitly Assigned Ordinality ;)

P.S. je takovym nepsanym pravidlem uvozovat typy pismenem T (s vyjimkou vyjimek jenz se uvozuji pismenem E).
« Poslední změna: 07-12-2018, 13:31:34 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #9 kdy: 07-12-2018, 14:10:23 »

Mám také menšie prekvapenie a to chybu
Citace
E2010 Incompatible types: 'TColumnIndex' and 'TVstOwner'
Kód: Delphi [Vybrat]
  1. type
  2.   {$SCOPEDENUMS ON}
  3.   TVstOwner = (FlatNumber, Owner, Deposit, Paid, Difference);
  4.   TVstDeposit = (Period, Deposit, Paid, Difference);
  5.   TVstItem = (Priority, Service, Deposit, Paid, Difference, Payment);
  6.   {$SCOPEDENUMS OFF}
  7. Použitie
  8. procedure TDepositDefrayal.TOwnerBasic.OwnerCompareNodes();
  9. begin
  10.   case Column of
  11.     TVstOwner.FlatNumber: Result := CompareValue(Data1.FlatNumber, Data2.FlatNumber);
  12.     ...
  13.  

Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1364
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #10 kdy: 07-12-2018, 14:21:12 »
Pak tedy proved typecast parametru Column na typ TVstOwner:

Kód: Delphi [Vybrat]
  1. case TVstOwner(Column) of
  2.   ...
  3. end;
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #11 kdy: 07-12-2018, 14:23:38 »
Aha, to je jednoduchšie ako všetko prevádzať na Integer :)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1364
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #12 kdy: 07-12-2018, 14:26:36 »
Aha, to je jednoduchšie ako všetko prevádzať na Integer :)

TColumnIndex, ne Integer ;) :)
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3647
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #13 kdy: 07-12-2018, 14:41:31 »
Ja som mal na mysli TVstOwner.FlatNumber a spol. Tak mi to v prvom momente prišlo na um. Koľko stĺpcov, toľko -1 zbytočných konverzií a úprav kódu.
Tvoj príspevok som pochopil správne.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1364
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #14 kdy: 07-12-2018, 14:55:17 »
Ja som mal na mysli TVstOwner.FlatNumber a spol. Tak mi to v prvom momente prišlo na um. Koľko stĺpcov, toľko -1 zbytočných konverzií a úprav kódu.

Ja tipoval ze jsi chtel typecast:

Kód: Delphi [Vybrat]
  1. case Column of
  2.   Integer(TVstOwner.FlatNumber): Result := CompareValue(Data1.FlatNumber, Data2.FlatNumber);
  3. end;

Parametr Column je vsak typu TColumnIndex. Tudiz by to bylo spis:

Kód: Delphi [Vybrat]
  1. case Column of
  2.   TColumnIndex(TVstOwner.FlatNumber): Result := CompareValue(Data1.FlatNumber, Data2.FlatNumber);
  3. end;

Samozrejme jednodussi je pretypovat parametr Column na typ enumerace.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):