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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • 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.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 847
  • Karma: 45
    • Verze Delphi: 10.3
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ů: 4584
  • Karma: 40
    • 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ů: 4584
  • Karma: 40
    • 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.

Online vandrovnik

  • Guru
  • *****
  • Příspěvků: 847
  • Karma: 45
    • Verze Delphi: 10.3
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ů: 4584
  • Karma: 40
    • 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ů: 2625
  • Karma: 133
    • 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ů: 4584
  • Karma: 40
    • 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 Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #8 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 Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #9 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 Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #10 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 Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #11 kdy: 07-12-2018, 15:02:04 »
Dobre si si tipoval. Len ja som expert to napísať tak, že to každý chápe ináč :)
A TColumnIndex je Integer. Len si už nepamätám, či som sa dostal ku kompilácii. Hm, máš pravdu. Na type TColumnIndex už nezáleží.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2625
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #12 kdy: 07-12-2018, 15:57:21 »
P.S. je takovym nepsanym pravidlem uvozovat typy pismenem T (s vyjimkou vyjimek jenz se uvozuji pismenem E).
Ono je to dokonce i psanym pravidlem, ale ja to povazuju za nedostatecnou idiocii, protoze typem je pak skoro vsechno.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2625
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #13 kdy: 07-12-2018, 15:59:14 »
A keď tam mám niečo na preskáčku?
Divny - kdyz se ten enum vztahuje k jednomu VTV - pocet sloupcu je stejny pro vsechny uzly

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4584
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Konštanty - ako s nimi narába kompilátor.
« Odpověď #14 kdy: 07-12-2018, 16:18:39 »
V tomto prípade som to už myslel všeobecne. Nie vo vzťahu k VST. Tam nie je čo riešiť.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.