Autor Téma: TList<Boolean> -> lstCalc.Free = AC  (Přečteno 470 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
TList<Boolean> -> lstCalc.Free = AC
« kdy: 07-01-2018, 18:10:34 »
Mám úplne jednoduchú záležitosť
Kód: Delphi [Vybrat]
  1. procedure TfrmAnnualSettlement.arobtnCalculateClick(Sender: TObject);
  2. var
  3.   lstCalc: TList<Boolean>;
  4. begin
  5.   lstCalc := TList<Boolean>.Create;
  6.   lstCalc.Add(not offchbPrepareInvoices.Checked); // 0
  7.   ...
  8. // Bez tohto mám AV
  9. ShowMessage(IntToStr(lstCalc.Count));  // procedure CalculateAccount(const AlstCalc: TList<Boolean>);
  10.   CalculateAccount(lstCalc);
  11.   lstCalc.Free;
  12. end;
Ak vynechám časť ShowMessage, tak pri Free dostanem AV. V procedúre CalculateAccount len čítam vložené hodnoty.
Vôbec netuším prečo.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #1 kdy: 07-01-2018, 18:41:15 »
Zistil som, že problém robí
Kód: Delphi [Vybrat]
  1. procedure CalculateAccount(const AlstCalc: TList<Boolean>);
  2. var
  3.   oCheckInvoices: TCheckInvoice;
  4.   lstTable: TStrings;
  5.  
  6.   procedure FreeAndNilObjects;
  7.   begin
  8.     if Assigned(oCheckInvoices) then  
  9.       FreeAndNil(oCheckInvoices);  // Toto mi zbehne
  10.  
  11.     FreeAndNil(lstTable);
  12.   end;
  13. begin
  14.   lstTable := TStringList.Create;
  15.   FreeAndNilObjects;
  16. Exit;
Ale ako môže existovať objekt, ktorý som nevytvoril?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #2 kdy: 07-01-2018, 18:55:18 »
Promílá se to tady furt dokola. Pascal neinicializuje lokální proměnné. T. j. chybí ti přiřazení nil na začátku procedury.
« Poslední změna: 07-01-2018, 18:59:11 od Ondřej Pokorný »
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #3 kdy: 07-01-2018, 19:14:03 »
Už som to tam doplnil. O tom inicializovaní viem. Ale že to musím dať aj tu mi nedošlo. Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 5
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #4 kdy: 07-01-2018, 19:14:41 »
Promílá se to tady furt dokola. Pascal neinicializuje lokální proměnné. T. j. chybí ti přiřazení nil na začátku procedury.

Nereportovalo sa to uz hadam milionkrat do EmbT, aby to podporili? A stale to nie je (Tokyo)?
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #5 kdy: 07-01-2018, 19:28:23 »
Niektoré veci sa inicializujú: napr. string na '', Boolean na False. A viac si nepamätám.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 385
  • Karma: 29
    • Verze Delphi: 10.2
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #6 kdy: 07-01-2018, 21:19:29 »
Niektoré veci sa inicializujú: napr. string na '', Boolean na False. A viac si nepamätám.

String se inicializuje jen proto, aby se na konci mohl bezpečně uvolnit.
Boolean se, řekl bych, neinicializuje.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3212
  • Karma: 30
    • Verze Delphi: XE7 professional
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #7 kdy: 07-01-2018, 21:31:50 »
Tak som sa na to trocha pozrel. Ono to nie je také jednoduché. Záleží na tom či sa jedná premennú globálnu, lokálnu a od ďalších vecí. A to už je na mňa zložité.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2046
  • Karma: 103
    • Verze Delphi: D2007, XE3, DX10
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #8 kdy: 07-01-2018, 21:39:57 »
Tak som sa na to trocha pozrel. Ono to nie je také jednoduché. Záleží na tom či sa jedná premennú globálnu, lokálnu a od ďalších vecí. A to už je na mňa zložité.
Je to jednoduchy: pokud je to lokalni promenna v subroutine, tak tam se pouze alokuje pamet pro vsechny promenne v dane subroutine odectenim jejich celkove velikosti od SP (jsou alokovany na stacku). Pokud je to member variable u objektu, tak po vytvoreni isntance objektu jsou vsechny member variables naplneny 0. Interpretace binarni 0 je podle typu. A pokud je to globalni promenna nekde v sekci VAR mimo tridu, tak ta se taky inicializuje na 0.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2046
  • Karma: 103
    • Verze Delphi: D2007, XE3, DX10
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #9 kdy: 07-01-2018, 22:05:40 »
Nereportovalo sa to uz hadam milionkrat do EmbT, aby to podporili? A stale to nie je (Tokyo)?
Vzdyt to taky nema v prekladanem nativnim kodu co delat

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #10 kdy: 08-01-2018, 04:28:09 »
Niektoré veci sa inicializujú: napr. string na '', Boolean na False. A viac si nepamätám.

ne a ne :)
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 52
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #11 kdy: 08-01-2018, 04:41:57 »
Excellent
Rated 1 time
Nereportovalo sa to uz hadam milionkrat do EmbT, aby to podporili? A stale to nie je (Tokyo)?
Vzdyt to taky nema v prekladanem nativnim kodu co delat

S tím se dá souhlasit, ale na druhou stranu už do kompilátoru naházeli mnohem větší kraviny (0-based strings, ARC, zrušení AnsiString), že by těm stříkačům mohli alespoň pomoci s nějakou direktivou.

FPC podporuje:
Kód: Delphi [Vybrat]
  1. procedure Test;
  2. var
  3.   A: Integer = 2;
  4. begin
  5.   Writeln(A);
  6.   Inc(A);
  7. end;

Největší sranda je, že právě ty 0-based strings a ARC udělali kvůli AppMethod, kterou pak po roce zapíchli. A tak nám to zbylo v mobilním Delphi.  >:( Hehe a RawByteString už vrátili zpátky... Postup managementu mi připomíná jak pes s kočičkou vařili dort :-X
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2046
  • Karma: 103
    • Verze Delphi: D2007, XE3, DX10
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #12 kdy: 08-01-2018, 07:49:24 »
Excellent
Rated 1 time
Největší sranda je, že právě ty 0-based strings a ARC udělali kvůli AppMethod, kterou pak po roce zapíchli. A tak nám to zbylo v mobilním Delphi.  >:( Hehe a RawByteString už vrátili zpátky... Postup managementu mi připomíná jak pes s kočičkou vařili dort :-X
IMHO to je proto, ze neexistuje jasna vize, kam se ma jazyk Pascal (Delphi) vyvijet, takze pak se to deje podle toho, jake momentalne maji lidi a na co momentalne narazili z okolniho sveta, aniz by si casto uvedomovali dopad dilcich rozhodnuti. A obchodne to nebudou mit taky jednoduche.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2046
  • Karma: 103
    • Verze Delphi: D2007, XE3, DX10
Re:TList<Boolean> -> lstCalc.Free = AC
« Odpověď #13 kdy: 08-01-2018, 07:54:24 »
FPC podporuje:
Kód: Delphi [Vybrat]
  1. procedure Test;
  2. var
  3.   A: Integer = 2;
  4. begin
  5.   ...
  6. end;
Ano, to je spravne reseni: kdyz to programator chce inicializovat, necht to udela deklarativne, ale ne ze pri po kazdem ENTER udelaji ZeroMemory na vsechny alokovane automaticke promenne.

 

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í:
Datový typ v Delphi, který má True a False: