Autor Téma: Máte pro tuto chybu logické vysvětlení?  (Přečteno 13896 krát)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Máte pro tuto chybu logické vysvětlení?
« kdy: 12-02-2013, 13:16:43 »
Zdravím,
původně jsem chtěl tuto zvláštnost prezentovat na ofic. foru, ale jejich webmaster asi neví jak naprogramovat přílohy. Navíc support je tak nepřehledný, že se mi nepodařilo rozluštit systém nahlašování chyb...

ale zpět k Delphi.

Tisíckrát pouštěný kód začal hlásit chybu. Jsem blb a nebo si ze mě Delphi dělá srandu?
Na obrázku je 5 řádků kódu. Červeně jsem doplnil jak jsou naplněny proměnné (ověřeno debugerem)

Nějaký tip na opravu?

Díky.

« Poslední změna: 12-02-2013, 13:18:44 od age.new »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #1 kdy: 12-02-2013, 13:44:14 »
původně jsem chtěl tuto zvláštnost prezentovat na ofic. foru, ale jejich webmaster asi neví jak naprogramovat přílohy. Navíc support je tak nepřehledný, že se mi nepodařilo rozluštit systém nahlašování chyb...

Tisíckrát pouštěný kód začal hlásit chybu. Jsem blb a nebo si ze mě Delphi dělá srandu?
Na obrázku je 5 řádků kódu. Červeně jsem doplnil jak jsou naplněny proměnné (ověřeno debugerem)

Ten obrazek je sice hezkej, ale asi by bylo ucelnejsi postnout sem primo zdrojovy kod, kterym lze tu chybu vyvolat, nejlepe jako console application, aby si to kazdy mohl jednoduse nakopirovat do sveho Delphi. A taky bys mel poskytnout informaci, co mas za Delphi.

Ostatne, kdyby ses probojoval na tu QC, tak by to tam po tobe chteli taky...

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #2 kdy: 12-02-2013, 13:48:30 »
Kód který vyvolává chybu je právě na tom obrázku. Jedná se o nepochopitelný návrat z funkce RightStr (StrUtils).

Jinak Delphi 6 (Update Pack 2).

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6161
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #3 kdy: 12-02-2013, 14:05:54 »
Ja tam vidím "5+7" is not a valid floating point value. To Ti nestačí?
Konvertuješ text na číslo!
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #4 kdy: 12-02-2013, 14:08:01 »
Ja tam vidím "5+7" is not a valid floating point value. To Ti nestačí?
Konvertuješ text na číslo!

emm ...máte + za postřeh. A dokážete zjistit proč se tak stane? Respektive proč RightStr nevrátí co má vrátit?
« Poslední změna: 12-02-2013, 14:10:25 od age.new »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #5 kdy: 12-02-2013, 14:11:20 »
Kód který vyvolává chybu je právě na tom obrázku. Jedná se o nepochopitelný návrat z funkce RightStr (StrUtils).

Jinak Delphi 6 (Update Pack 2).
OMG, a to si myslis, ze kazdej kdo by se ev. chtel zabyvat Tvym problemem, ze si to z toho obrazku bude opisovat  :o

Taky jsi nevysvetlil, co to presne znamena tisickrat pousteny kod, protoze nedavno tu jeden clovek pri popisu chyby tvrdil, ze to pouziva od D3 a vzdycky mu to fungovalo a nakonec se prislo na to, ze sice chyba v prekladaci je, ale nejmene od D3, takze mu to nikdy fungovat nemohlo... Navic postnul priklad, na kterem se nedalo chybu zopakovat, protoze se pri nem chyba neprojevovala.

BTW, s D6 uz leta nedelam, ale ten co mi tu zbyl, ma Update 3.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #6 kdy: 12-02-2013, 14:31:59 »
Kód který vyvolává chybu je právě na tom obrázku. Jedná se o nepochopitelný návrat z funkce RightStr (StrUtils).

Jinak Delphi 6 (Update Pack 2).
OMG, a to si myslis, ze kazdej kdo by se ev. chtel zabyvat Tvym problemem, ze si to z toho obrazku bude opisovat  :o

Taky jsi nevysvetlil, co to presne znamena tisickrat pousteny kod, protoze nedavno tu jeden clovek pri popisu chyby tvrdil, ze to pouziva od D3 a vzdycky mu to fungovalo a nakonec se prislo na to, ze sice chyba v prekladaci je, ale nejmene od D3, takze mu to nikdy fungovat nemohlo... Navic postnul priklad, na kterem se nedalo chybu zopakovat, protoze se pri nem chyba neprojevovala.

BTW, s D6 uz leta nedelam, ale ten co mi tu zbyl, ma Update 3.


Proč by si to někdo opisoval? Syntaxe těch 3 defaultních funkcí je snad každému jasná. Navíc jejich použití na D6 je bezproblémové.

Aby mi zde opět někdo nenapsal, že převádím text na číslo, pokusím se to popsat "lidsky":

Máme jednu proměnou nazvanou s_tmp deklarovanou jako string. Tu si naplním hodnotou '+755+700'.
Druhá proměná je pole s pevnou délkou o počtu dvou čísel o velikosti 1 byte.
Toto pole je naplněná hodnotou [ 0 ] := 1 a [ 1 ] := 5 (není důležité proč, ale pokud by
to někoho zajímalo, tak jsou to pozice znaků + a - v proměnné s_tmp.

Následují dva řádky kódů, které mají s_tmp rozdělit na dva stringy tak, aby v prvním bylo první zmanénko a číslo a ve druhém stringku bylo druhé znaménko a číslo. Podle všeho bychom měli dostat v prvním stringu (param_a) dostat '+755' a v druhém stringu (param_b) dostat '+700'.

Pak by následný převod textu na číslo neskončilo chybou...

PROČ ale naplnění druhého stringu (param_b) nabylo hodnoty '5+70', když syntaxe funkce RightStr mluví jasně?!?!?! Kam zmizela poslední nula??!!

Toť otázka! (né verze softu ani kolkrát byl kód spuštěn)...








« Poslední změna: 12-02-2013, 14:33:58 od age.new »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #7 kdy: 12-02-2013, 15:11:59 »
Toť otázka! (né verze softu ani kolkrát byl kód spuštěn)...
Ano, pan je opravdovy znalec   :o

Ne. To vsechno jsou jen tvoje povrchni interpretace nejakeho jevu o kterem nikdo nic nevi a snazime se o  nem neco dozvedet.

Ono nejpsis, kdyz by sis ten kod vyclenil do samostatneho programku, abys demonstroval, jak ti to nefunguje, tak by zjistil, ze ti to normalne funguje, kdyz to fungovalo 1000x   ;D

Kdyz vyjdu z predpokladu, ze ti to fungovalo 1000x a najednou prestalo, tak je otazka, co se zmenilo a proto je dulezite, co presne znamena ten tisickrat spousteny kod. Protoze typicka zalezitost byva, ze si vlivem chyby buhvi kde prepisujes pamet a monetalne ti selhava RightStr(), ktere bude vsem ostatnim normalne fungovat (a tobe mimo tu aplikaci taky). A nebo totez v blede modrem: tu pamet sis prepisoval uz buhvi jako dlouho, ale bylo to v oblasti, kde to nicemu nevadilo a neco jsi  pridall/ubral a zacalo to prepisovat tam, kde to vadi...

Jestli chces ten problem resit, tak si to bud protrasuj v CPU okne,  nebo udelej programek, na kterem tu chybu zopakujes (odborne se tomu rika izolujes) a nechas overit, jestli to dela i nekomu jinemu nez tobe a ev. mu das sanci dotrasovat se k problemu, kdyz to sam neumis...

Jinak bych ti doporucil pustit si tu aplikaci s FastMM ve full debug modu.
« Poslední změna: 12-02-2013, 15:14:04 od pf1957 »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #8 kdy: 12-02-2013, 15:26:44 »
Takže mi tvrdíte, že z nějakého důvodu se proměná string s_tmp naplněná na '+755+700' se na obřádku "nějak" změní na '+755+70' ... ? 



Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #9 kdy: 12-02-2013, 15:27:05 »
2 age.new:
a to si jako na dany radek (s param_b) nedokazes dat breakpoint a podivat se, co vlastne mas v promennych,
normalne bych se vsadil, ze v s_tmp mas na konci mezeru, ktera ti ovlivni, kolik toho vlastne kopirujes
« Poslední změna: 12-02-2013, 15:29:03 od < z > »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #10 kdy: 12-02-2013, 15:28:36 »
2 age.new:
a to si jako na dany radek (s param_b) nedokaze dat breakpoint a podivat se, co vlastne mas v promennych,
normalne bych se vsadil, ze v s_tmp mas na konci mezeru, ktera ti ovlivni, kolik toho vlastne kopirujes


Kam sem se to dostal ...  :-[

Prosim přečtěte si ještě jednou první post. Navíc jak by to mohla mezera na konci ovlivnit? ... tak jako tak by v param_b nebylo o znak méně, respektive by nechyběla jedna 0.
« Poslední změna: 12-02-2013, 15:31:30 od age.new »

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1174
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #11 kdy: 12-02-2013, 15:30:40 »
to je tak, kdyz z bohnic nekoho pusti :D :D :D

takze znovu - neumis pouzit breakpoint?

(tak na zacatku, burt fuk)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #12 kdy: 12-02-2013, 15:35:30 »
to je tak, kdyz z bohnic nekoho pusti :D :D :D

takze znovu - neumis pouzit breakpoint?

(tak na zacatku, burt fuk)

Když to nejde jinak, opět "česky" a polopatě:

na obrázku je pár řádků kódu. Červeně jsem dopsal jaké hodnoty jsou v proměnných. Správnost hodnot jsem si ověřil přes debugger za pomoci breakpointu. Žádné mezery v s_tmp nejsou. Žádný jiný kód není, žádné jiné operace s pamětí se neprovádí....

... ještě jednou mi někdo napíše ať použiji breakpoint a už se tu neukážu

Bylo by fajn kdyby se k tomu vyjádřil programátor co umí číst a myslet.


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6161
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #13 kdy: 12-02-2013, 15:36:14 »
Citace
Máme jednu proměnou nazvanou s_tmp deklarovanou jako string. Tu si naplním hodnotou '+755+700'.
Druhá proměná je pole s pevnou délkou o počtu dvou čísel o velikosti 1 byte.
Toto pole je naplněná hodnotou [ 0 ] := 1 a [ 1 ] := 5 (není důležité proč, ale pokud by
to někoho zajímalo, tak jsou to pozice znaků + a - v proměnné s_tmp.

Následují dva řádky kódů, které mají s_tmp rozdělit na dva stringy tak, aby v prvním bylo první zmanénko a číslo a ve druhém stringku bylo druhé znaménko a číslo. Podle všeho bychom měli dostat v prvním stringu (param_a) dostat '+755' a v druhém stringu (param_b) dostat '+700'.
Tak sa to nerobí. Pozíciu + a - si máš vždy zistiť pri každom reťazci. Mne to vychádza tak, že je znamienko na inej pozícii než prepokladáš.
 
A aký máš dôvod mať jeden reťazec '+755+700' nie dva reťazce?
Citace
... ještě jednou mi někdo napíše ať použiji breakpoint a už se tu neukážu
;D ;D ;D ;D ;D
Prosím Ťa spamätaj sa. Ľudia Ti chcú pomôcť a Ty sa im "vyhrážaš"? Vždy je prvá vec breakpoint a zistenie skutočných hodnôt s ktorými práve pracuješ.
 
Veľa šťastia
« Poslední změna: 12-02-2013, 15:40:08 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #14 kdy: 12-02-2013, 15:39:50 »
Citace
Máme jednu proměnou nazvanou s_tmp deklarovanou jako string. Tu si naplním hodnotou '+755+700'.
Druhá proměná je pole s pevnou délkou o počtu dvou čísel o velikosti 1 byte.
Toto pole je naplněná hodnotou [ 0 ] := 1 a [ 1 ] := 5 (není důležité proč, ale pokud by
to někoho zajímalo, tak jsou to pozice znaků + a - v proměnné s_tmp.

Následují dva řádky kódů, které mají s_tmp rozdělit na dva stringy tak, aby v prvním bylo první zmanénko a číslo a ve druhém stringku bylo druhé znaménko a číslo. Podle všeho bychom měli dostat v prvním stringu (param_a) dostat '+755' a v druhém stringu (param_b) dostat '+700'.
Tak sa to nerobí. Pozíciu + a - si máš vždy zistiť pri každom reťazci. Mne to vychádza tak, že je znamienko na inej pozícii než prepokladáš.
 
A aký máš dôvod mať jeden reťazec '+755+700' nie dva reťazce?

řetězec +755+700 si lze představit jako +X+Y. Nerozumím ale to s těma pozicema pri kaˇždém řetězci?! ... prosím o vysvětlení