Autor Téma: Open array D5 bug?  (Přečteno 153 krát)

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 261
  • Karma: 12
    • Verze Delphi: D5, XE2
Open array D5 bug?
« kdy: 14-09-2019, 00:32:39 »
Následující kód hodí AV. Jakmile to změním z funkce na proceduru, nebo funkci zavolám s neprázdným polem, je AV pryč. Jedná se o bug v Delphi 5, nebo mi něco nedochází?

Kód: Delphi [Vybrat]
  1. function Test(arr: Array of string): Boolean;
  2. var
  3.   I: Integer;
  4. begin
  5.   if Length(arr) > 0 then
  6.   begin
  7.     for I:= Low(arr) to High(arr) do
  8.     begin
  9.       arr[I] := LowerCase(arr[I]);
  10.     end;
  11.   end;
  12. end;
  13.  
  14. procedure TForm1.Button1Click(Sender: TObject);
  15. begin
  16.   Test([]);
  17. end;
  18.  

Call stack:
Kód: Delphi [Vybrat]
  1. @LStrAddRef
  2. @AddRefArray
  3. TForm1.Button1Click(???)
  4.  
nil

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 261
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Open array D5 bug?
« Odpověď #1 kdy: 14-09-2019, 21:46:49 »
Tak se zdá, že je to vážně bug v D5. Už od Delphi7 výš je to bez problému. Škoda, že jsem vázaný právě na D5 :(
nil

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Open array D5 bug?
« Odpověď #2 kdy: 14-09-2019, 22:29:18 »
Excellent
Rated 1 time
Nemůžu si pomoct, běhá mi z takového kódu mráz po zádech. Nedal by se ten parametr dát jako const nebo var?

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 261
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Open array D5 bug?
« Odpověď #3 kdy: 14-09-2019, 23:04:31 »
Netušil jsem, že s open array parametrem se nesmí manipulovat (alespoň tedy v případě managed typů jako třeba ten string). Ale skutečně const open array mi pomohlo, takže díky za radu! Var open array ztrácí tu příjemnou jednoduchost open array konstruktoru. Jedná se o vyhledávací funkci, kde v open array parametru dostanu masky souborů k vyhledání (např. ['*.pas', '*.txt']) a s tím souvisí i to, že potřebuji obsah manipulovat - aby se dalo provést case insensitive porovnání, což obvykle vyžaduje nějaké to LowerCase() nebo UpperCase(). No nic, pokud nejde manipulovat přímo obsah open array parametru, vyřeším to lokální kopií do standardního dynamického pole. Zvláštní ale je, že kompiler nijak neprotestuje, v helpu se o tomhle úskalí nepíše ani slovo, a navíc vyšší verze Delphi s tím nemají žádný problém. A vůbec, projev té chyby je velmi podivný, kdy v podstatě výjimku vyhodí kód (resp. přítomnost kódu), který se vůbec nevykonává (pole je prázdné a manipulace s jeho obsahem je v podmínce "if Length() > 0"). Opravdu tomu nerozumím.
« Poslední změna: 14-09-2019, 23:17:05 od Morrison »
nil

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Open array D5 bug?
« Odpověď #4 kdy: 15-09-2019, 10:34:49 »
Určitě by se tomu porozumět dalo, kdybychom si to krokovali v assembleru. Vzhledem k tvým popisům bych odhadoval, že Delphi 5 předají prázdné open array jako NULL pointer, ale následně v nějaké inicializační funkci s něčím takovým nepočítají a spadnou tam. Takže to asi bude chyba, opravená v dalších verzích. Ale za sebe musím říct, že i tak bych určitě pole předával odkazem, ne hodnotou (možná zbytečně, když s tím novější Delphi umí pracovat, ale připadá mi krajně ošklivé předávat velké hodnoty hodnotou...).

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 261
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Open array D5 bug?
« Odpověď #5 kdy: 16-09-2019, 09:29:58 »
Ošklivé možná, to nedokážu posoudit, ale rozhodně je open array konstruktor velmi pohodlný, obzvlášť když se předávají jen nějaké konstanty jako v mém případě. Pro uživatele rutiny, kterým nemusím být nutně já, je celkem velký rozdíl jestli:
A) musí nadeklarovat pole, alokovat pole, naplnit ho hodnotami a pak teprve předat dál
B) se dá udělat tohle všechno v jednom řádku pomocí open array kontruktoru
nil

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Open array D5 bug?
« Odpověď #6 kdy: 16-09-2019, 12:11:42 »
A jsi si vědom toho, že s const by to pro uživatele vypadalo přesně stejně?

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 261
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Open array D5 bug?
« Odpověď #7 kdy: 16-09-2019, 12:39:43 »
Však jo, jak už jsem psal, na základě Tvojí rady jsem z toho udělal const open array a je to tím vyřešené.
nil