Autor Téma: Zajímavé chování funkce  (Přečteno 7168 krát)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3466
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Zajímavé chování funkce
« Odpověď #15 kdy: 22-03-2013, 12:16:56 »
No, mně přijde, že použití výrazu x:=x+ něco bez předchozí inicializace x bude čuňačina kdekoliv  :) (bez ohledu na to, jak je definováno, ukládáno a předáváno to x)
Obecne ano, ale v tomle pripade je x inicializovano prekladacem na nil a stringove knihovny se k tomu chovaji jako k prazdnemu stringu.

Prave ze IMHO ne.

Já jsem v potomku datasetu mel

Kód: Delphi [Vybrat]
  1. s := PSGetTableName;
  2. s := PSGetKeyFields;
  3.  

a po druhem volani jsem pak mel tCRM_Currency;idCurrency - normalne to spojil, uznavam ze to bylo pro ucely testovani, ale i tak.
Embarcadero MVP - Czech republic

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:Zajímavé chování funkce
« Odpověď #16 kdy: 22-03-2013, 12:36:59 »
Obecne ano, ale v tomle pripade je x inicializovano prekladacem na nil a stringove knihovny se k tomu chovaji jako k prazdnemu stringu.

Podle toho, co se tu psalo, tak je výchozí hodnota taková, jaká byla vrácena při posledním volání. A to mi přijde jako taková magie, protože to z toho kódu není zřejmé a může se to v budoucnu změnit, takže se na to nedá ani spoléhat.

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Zajímavé chování funkce
« Odpověď #17 kdy: 22-03-2013, 13:44:13 »
já bych v tom žádnou vědu a vyšší smysl nehledal. prostě nepozorný prográmator zapomněl na začátek funkce napsat Result := ''; a protože to delphi neoznamuje jako warning, tak se na to zapomnělo.

to zase budou mít všichni bez zaplacených aktualizací radost, že si to musí opravit a ošetřit sami :) a nezapomenout na to při nové instalaci :)
Embarcadero Technology Partner

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3466
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Zajímavé chování funkce
« Odpověď #18 kdy: 22-03-2013, 14:20:02 »
to zase budou mít všichni bez zaplacených aktualizací radost, že si to musí opravit a ošetřit sami :) a nezapomenout na to při nové instalaci :)

WTF? pokud se jedná o tu zminovanou funkci v RTL, tak ta je stejná i v Delphi 5. Ted jsem se dival.
Embarcadero MVP - Czech republic

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Zajímavé chování funkce
« Odpověď #19 kdy: 22-03-2013, 14:52:37 »
WTF? pokud se jedná o tu zminovanou funkci v RTL, tak ta je stejná i v Delphi 5. Ted jsem se dival.

tak tam tu chybu mají už od Delphi 5, asi si jí nikdo z embarcadera nevšiml a nebo jí nikdo nehlásil. na věci to ale nic nemění (dal bych z hlavy ještě 2 případy podobných kravinek, které jsem musel obcházet). jedna z nich je tam taky minimálně od D2007.

nebo to teda není chyba?
Embarcadero Technology Partner

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zajímavé chování funkce
« Odpověď #20 kdy: 22-03-2013, 20:34:04 »
Prave ze IMHO ne.
Já jsem v potomku datasetu mel
Kód: Delphi [Vybrat]
  1. s := PSGetTableName;
  2. s := PSGetKeyFields;

a po druhem volani jsem pak mel tCRM_Currency;idCurrency - normalne to spojil, uznavam ze to bylo pro ucely testovani, ale i tak.

Jak to, ze ne  :o Vzdyt to tady od rana vysvetluju, v helpu to popisujou :'( Tak posledni pokus...
Preklad kodu, ktery vypada na prvni pohled podivne a jak je videt nesrozumitelne, je ekvivalentni nasledujicimu:

Kód: Delphi [Vybrat]
  1. procedure PSGetTableName(var AResult:String);
  2. ...
  3. procedure PSGetKeyFields(var AResult:String);
  4. ...
  5. var
  6.   S: String;
  7. begin
  8.   S := '';
  9.   PSGetTableName(S);
  10.   PSGetKeyFields(S);
  11.   ...
  12.  

U toho by ses taky divil, ze ti to zretezi  :o Takhle se chova Delphi nejpsis od zavedeni reference counted stringu v D2



Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3466
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Zajímavé chování funkce
« Odpověď #21 kdy: 22-03-2013, 20:55:15 »
Jak to, ze ne  :o Vzdyt to tady od rana vysvetluju, v helpu to popisujou :'( Tak posledni pokus...
Preklad kodu, ktery vypada na prvni pohled podivne a jak je videt nesrozumitelne, je ekvivalentni nasledujicimu:

Díky, já to chápu jak to funguje, když už o tom vím že to nastává, jen mne včera nenapadlo, že by to mohlo nastávat :-), já jsem jen nerozuměl té větě
"x inicializovano prekladacem na nil". Kdyby bylo nastaveno na nil (tj. na ekvivalent prázdného řetezce), tak by to nespojil. Ale asi se ta věta vztahovala k něčemu jinému.

Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Zajímavé chování funkce
« Odpověď #22 kdy: 22-03-2013, 21:27:55 »
já jsem jen nerozuměl té větě "x inicializovano prekladacem na nil". Kdyby bylo nastaveno na nil (tj. na ekvivalent prázdného řetezce), tak by to nespojil.
Ale asi se ta věta vztahovala k něčemu jinému.
Ne, vztahovala se presne k tomu: "x inicializovano prekladacem na nil" znamena, ze pri vstupu do subroutiny prekladac lokalni automatickou promennou typu string nastavi na nil, zpravidla napushovanim 0 do stacku - z pohledu pascalu se to deje 'pod begin'  a logicky to odpovida prirazeni S := ''; z meho posledniho prispevku.

Tj. ta promenna se inicializuje prave jednou pri vstupu do subroutiny (a ne pred kazdym prirazenim).