Autor Téma: zaklad k referenciam  (Přečteno 800 krát)

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
zaklad k referenciam
« kdy: 28-09-2022, 20:15:03 »
mam
Kód: Delphi [Vybrat]
  1. type
  2.   TclassA = class;
  3.  
  4.   TclassA = class
  5.     item: TclassA;
  6.   end;

Kód: Delphi [Vybrat]
  1. var
  2.     a, b: TclassA;
  3. begin
  4.     a := TclassA.Create;
  5.     a.item := TclassA.Create;
  6.     b := a.item;
  7. end;

ale v degugeri je b = nil
mozete mi vysvetlit ze preco tam nie je referencia na a.item?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:zaklad k referenciam
« Odpověď #1 kdy: 28-09-2022, 20:26:08 »
Odpoveď neviem, ale
  • Prvý riadok považujem za doprednú definíciu
  • Tá sa používa v prípadoch, keď triedu chceš použiť v nejakej inej triede. Ale tie dve triedy sú na sebe závislé - kruhový odkaz
  • Mať pole, ktoré je typu "rodič" mi pripadá viac ako divné. Doslovne ako hlúposť
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:zaklad k referenciam
« Odpověď #2 kdy: 28-09-2022, 20:28:10 »
  • Mať pole, ktoré je typu "rodič" mi pripadá viac ako divné. Doslovne ako hlúposť
pouziva sa za strom

ale pytal som sa na nieco ine

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:zaklad k referenciam
« Odpověď #3 kdy: 28-09-2022, 20:37:45 »
ale pytal som sa na nieco ine
Ja viem. Len akosi predpokladám, že práve v tom je problém. Ale vieš aké sú moje vedomosti.
Takéto odpovede dávam vtedy, keď si myslím, žeby mohli
  • pomôcť k výsledku
  • vyprovokovať niekoho k odpovedi. To sa mi párkrát podarilo  ;D
Ináč sa snažím mlčať!
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:zaklad k referenciam
« Odpověď #4 kdy: 28-09-2022, 21:18:56 »
Kód: Delphi [Vybrat]
  1. var
  2.     a, b: TclassA;
  3.     aPointer: Pointer;
  4. begin
  5.     a := TclassA.Create;
  6.     a.item := TclassA.Create;
  7.     aPointer := Addr(a);
  8.     memo1.lines.add('a .. ' + IntToHex(NativeInt(aPointer^),8));  //debug
  9.     aPointer := Addr(a.item);
  10.     memo1.lines.add('i .. ' + IntToHex(NativeInt(aPointer^),8));  //debug
  11.     b := a.item;
  12.     aPointer := Addr(b);
  13.     memo1.lines.add('b .. ' + IntToHex(NativeInt(aPointer^),8));  //debug
  14. end;

asi to bude haluz debugeru, takto mi to dava ocakvany vysledok

a .. 03008AA0
i .. 03008AB0
b .. 03008AB0

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:zaklad k referenciam
« Odpověď #5 kdy: 28-09-2022, 22:03:15 »
Nebylo to jen kvůli zapnutým optimalizacím? To přiřazení do "b" možná kompilátor vyhodil, když jsi "b" pak už neměl nikde použité.

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:zaklad k referenciam
« Odpověď #6 kdy: 29-09-2022, 06:54:05 »
Nebylo to jen kvůli zapnutým optimalizacím? To přiřazení do "b" možná kompilátor vyhodil, když jsi "b" pak už neměl nikde použité.
ale aj pri predchadzajucom pripade tam mam nil v debugeru
« Poslední změna: 29-09-2022, 06:58:21 od František »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3183
  • Karma: 111
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:zaklad k referenciam
« Odpověď #7 kdy: 29-09-2022, 08:45:53 »
Samozrejme ze je to k vuli optimalizacim, zmen ten posledni radek z
   memo1.lines.add('b .. ' + IntToHex(NativeInt(aPointer^),8));  //debug
na
   memo1.lines.add('b .. ' + IntToHex(NativeInt(b),8));  //debug

protoze jinak na tom radku to b uz neni k nicemu a optimizer ho vyhodil
Embarcadero MVP - Czech republic

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:zaklad k referenciam
« Odpověď #8 kdy: 29-09-2022, 17:01:34 »
   memo1.lines.add('b .. ' + IntToHex(NativeInt(b),8));  //debug
stale je nil a vracia mi 00000000

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:zaklad k referenciam
« Odpověď #9 kdy: 29-09-2022, 18:12:13 »
cely fígeľ je ftom ze mi to pracuje spravne (overoval som si teoriu:) ale debugger ma zmiatol ... tak by som rad dosiahol, aby mi to zobrazil, ak je to mozne

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:zaklad k referenciam
« Odpověď #10 kdy: 30-09-2022, 08:53:52 »

Možno to už máš vyriešené, ale aj tak. Ja vidím dve cesty:
  • Nečisté. Nedefinovať premenné ako lokálne premenné
  • Použiť premenné na konci funkcie. Nejako takto
Kód: Delphi [Vybrat]
  1.   {$IFDEF DEBUG}  //  Aby to neotravovalo v release
  2.    if a + b = 0 then //  Podmienka, ktorá nebude nikdy splnená. Aby kompilátor nefrflal
  3.      ShowMessage('adsf');
  4.   {$ENDIF}
  5.  
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Ján Masaryk

  • Plnoletý
  • ***
  • Příspěvků: 102
  • Karma: 5
    • Verze Delphi: 2010
Re:zaklad k referenciam
« Odpověď #11 kdy: 01-10-2022, 13:40:49 »
Citace
Kód: Delphi [Vybrat]
  1.     var
  2.         a, b: TclassA;
  3.     begin
  4.         a := TclassA.Create;
  5.         a.item := TclassA.Create;
  6.         b := a.item;
  7.     end;
  8.  

Nemalo by to byť tako ?

Kód: Delphi [Vybrat]
  1.     var
  2.         a, b: TclassA;
  3.     begin
  4.         a := TclassA.Create;
  5.         b := TclassA.Create;
  6.         a.item := TclassA.Create;
  7.         b := a.item;
  8.     end;
  9.  

teda nemal si vytvorené
        b := TclassA.Create;


Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1570
  • Karma: 37
    • Pepak.net
Re:zaklad k referenciam
« Odpověď #12 kdy: 01-10-2022, 17:22:59 »
Jen na ten kód koukám, nespouštím ho. Ale myslím, že to mám správně.

1) Původní kód:
Kód: Delphi [Vybrat]
  1. var
  2.     a, b: TclassA;
  3. begin
  4.     a := TclassA.Create;
  5.     a.item := TclassA.Create;
  6.     b := a.item;
  7. end;
Nesprávné zobrazování b v debuggeru je podle mě způsobené optimalizátorem - řádek 6 byl úplně odstraněn.

2) Novější kód:
Kód: Delphi [Vybrat]
  1. var
  2.     a, b: TclassA;
  3.     aPointer: Pointer;
  4. begin
  5.     a := TclassA.Create;
  6.     a.item := TclassA.Create;
  7.     aPointer := Addr(a);
  8.     memo1.lines.add('a .. ' + IntToHex(NativeInt(aPointer^),8));  //debug
  9.     aPointer := Addr(a.item);
  10.     memo1.lines.add('i .. ' + IntToHex(NativeInt(aPointer^),8));  //debug
  11.     b := a.item;
  12.     aPointer := Addr(b);
  13.     memo1.lines.add('b .. ' + IntToHex(NativeInt(aPointer^),8));  //debug
  14. end;
Podle mě špatně vyhodnocuješ, co tento kód dělá. Ve skutečnosti jsi chtěl použít IntToHex(NativeInt(aPointer),8), to by ti fungovalo správně. To, co jsi napsal místo toho (IntToHex(NativeInt(aPointer^),8)), mě popravdě řečeno docela překvapuje, že se vůbec přeloží, ale když už se přeloží, tak si uvědom rozdíl mezi aPointer a aPointer^ - první je "hodnota ukazatele" (= adresa obsažená v proměnné aPointer), druhé je "obsah paměti na adrese, na kterou ukazuje aPointer). Problém s tvým b je v tom, že to je adresa instance třídy TClassA a to, co zobrazuješ pomocí aPointer^, je hodnota jejího prvního prvku, což v tomto případě je proměnná item, kterou jsi zatím nenaplnil, takže naprosto správně obsahuje nil.

Ale je tu jedna zrada, kterou takhle z hlavy nedám - tohle, co jsem napsal, by platilo, kdyby aPointer bylo typu ^Pointer (nebo v zásadě ^SkoroCokolivTrebaIntegerNeboByte). Pro obyčejné Pointer by ti kompilátor neměl dovolit udělat dereferenci, tedy aPointer^.

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:zaklad k referenciam
« Odpověď #13 kdy: 01-10-2022, 21:14:19 »
no takze chcel som si overit, ze ci b := a.item bude realne ukazovat na tu istu pamat,
takzer ako sa ktomu dopracujem?

ps. doplnil som si este jeden string prvok a na konci, ked som ho priradil b.tx, objavil sa v debugeri aj v a.item.tx
« Poslední změna: 01-10-2022, 21:19:37 od František »

Offline František

  • Guru
  • *****
  • Příspěvků: 829
  • Karma: 7
    • Verze Delphi: comunity 10.4.2, D2007, D11
Re:zaklad k referenciam
« Odpověď #14 kdy: 01-10-2022, 21:46:45 »
pozerate to na mobile? nezobrazuju sa pripojene obrazky