Delphi => Obecné => Téma založeno: Morrison 14-09-2019, 00:32:39
Název: Open array D5 bug?
Přispěvatel: Morrison14-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í?
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.
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...).
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