Autor Téma: nastavení a zpřístupnění hodnot přes pointer  (Přečteno 178 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
nastavení a zpřístupnění hodnot přes pointer
« kdy: 30-05-2019, 13:07:40 »
Tady mám jednoduchou třídu, kde se snažím použít ukazatel na konfigurační strukturu.

Kód: Delphi [Vybrat]
  1. Unit translation;
  2.  
  3. interface
  4.  
  5. uses Classes,SysUtils;
  6.  
  7. type TConfig = record
  8.   on: boolean;
  9.   reset: boolean;
  10.   trackKeys: byte;
  11.   analyzeStringChars: boolean;
  12.   searchForBegin: boolean;
  13. end;
  14.  
  15. type
  16.    TTranslation = Class
  17.    private
  18.     c:      ^TConfig;
  19.    public
  20.     config: TConfig;
  21.    constructor Create();
  22.    procedure foo();
  23.  
  24.    end;

implementace

Kód: Delphi [Vybrat]
  1. constructor TTranslation.Create();
  2.  begin
  3.     c  := @config;
  4.  end;
  5.  
  6. procedure TTranslation.foo();
  7. var b: boolean;
  8. begin
  9.   if ( not c^.on OR
  10.        not c^.reset OR
  11.        not c^.analyzeStringChars
  12.        ) then
  13.     b := false
  14.   else
  15.     b := true;
  16. end;
  17.  
  18. end.

Procedura foo se pokouší o přístup k ukazateli.

Zde je kód, kde jsem konfigurační strukturu nastavil a pak zavolal foo.

Kód: Delphi [Vybrat]
  1. unit translation_fnc;
  2.  
  3. interface
  4.  
  5. uses Classes,SysUtils,translation;
  6.  
  7. procedure test;
  8.  
  9. implementation
  10.  
  11. procedure test;
  12. var MTT: TTranslation;
  13. var c: TConfig;
  14. begin
  15.   MTT := TTranslation.Create;
  16.   c := MTT.config;
  17.   c.on := true;
  18.   c.analyzeStringChars := true;
  19.   MTT.foo();
  20. end;
  21.  
  22.  
  23. end.
  24.  

Nastavil breakpointy jsem meze na řádky

b := false

and

b := true

A pak přidám kukátko do c ^ kde vidím tyto hodnoty:

Kód: Delphi [Vybrat]
  1. (False, False, 0, False, False)

Chtěl bych nastavit hodnoty c ^ na

Kód: Delphi [Vybrat]
  1. (True, False, 0, True, False)

z testovací funkce. Co dělám špatně, že nemám hodnoty podle očekávání?
« Poslední změna: 30-05-2019, 13:16:20 od vangog »

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:nastavení a zpřístupnění hodnot přes pointer
« Odpověď #1 kdy: 30-05-2019, 13:47:02 »
Je to osekaná třída se kterou teď zrovna pracuju. V reálu tam mám těch pointerů více. Proč? Tak třeba se mi nechce psát furt název "TAObj." tak to zkracuju přes t.

Kód: Delphi [Vybrat]
  1. type
  2.    TTranslation = Class
  3.    private
  4.       TAObj : TAnalysis;
  5.       t:      ^TAnalysis;
  6.       SRData: TStringReplaceData;
  7.       s:      ^TStringReplaceData;
  8.       counters: TTrackerCounters;
  9.       cn:        ^TTrackerCounters;
  10. ...

Na tom snad není technicky vzato nic špatně, že jsem se rozhodl přistupovat přes pointery, abych si zkrátil kód.

Kód: Delphi [Vybrat]
  1. constructor TTranslation.Create();
  2.  begin
  3.     c  := @config;
  4.     t  := @TAObj;
  5.     s  := @SRData;
  6.     cn := @counters;
  7.  end;
  8.  
« Poslední změna: 30-05-2019, 13:49:45 od vangog »

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:nastavení a zpřístupnění hodnot přes pointer
« Odpověď #2 kdy: 30-05-2019, 13:53:30 »
Chápu to tak, že problém je v proceduře test. Tam to ukládám do instance TConfig, místo to MTT.config.

Toto funguje:
Kód: Delphi [Vybrat]
  1.   MTT.config.on := true;
  2.   MTT.config.analyzeStringChars := true;
  3.   MTT.foo();
  4.  

Ale já bych chtěl zkracovátko. Protože chci aby ten soubor měl kratší řádky. Jak je to moc dlouhé směrem doprava tak to není přehledné.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:nastavení a zpřístupnění hodnot přes pointer
« Odpověď #3 kdy: 30-05-2019, 14:04:44 »
Už to mám

Kód: Delphi [Vybrat]
  1. procedure test;
  2. var MTT: TTranslation;
  3. var c: ^TConfig;
  4. begin
  5.   MTT := TTranslation.Create;
  6.   c := @MTT.config;
  7.   c^.on := true;
  8.   c^.analyzeStringChars := true;
  9.   MTT.foo();
  10. end;