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

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #15 kdy: 12-02-2013, 15:41:37 »
Za prvé, ověřil bych si, že se skutečně volá právě ta funkce RightStr, kterou očekávám.
Za druhé, ověřil bych si (v CPU View), že ta funkce dostává parametry, které očekávám.
Za třetí, ověřil bych si (opět v CPU View), že ta funkce dělá to, co si podle zdrojáku myslím, že dělá.

Mírně offtopic, kdybych měl takhle definované vstupy, tak bych nepoužíval funkce LeftStr a RightStr (které navíc v Delphi 5 ještě nemám, nebo pokud mám, tak mi zjevně nikdy nestály za to, abych je hledal), ale Copy:
Kód: Delphi [Vybrat]
  1. param_a := Copy(s_tmp, b_array_tmp2[0], b_array_tmp2[1]-b_array_tmp2[0]);
  2. param_b := Copy(s_tmp, b_array_tmp2[1], MaxInt);
A pak bych asi uškrtil toho blba, co proměnné pojmenovává stylem b_array_tmp2.

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ěď #16 kdy: 12-02-2013, 15:41:54 »
... ještě jednou mi někdo napíše ať použiji breakpoint a už se tu neukážu

parada +1

takze ... a do "RightStr" funkce sis taky dal breakpoint?

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ěď #17 kdy: 12-02-2013, 15:43:45 »
Ja som sa Ťa nepýtal ako si to mám predstaviť! Ale či to tak musí byť. Napr. z internetu.
Ak si mám niečo predstaviť ako x a y súradnice, tak na to použijem TPoint.

V prvom rade by si sa mal zbaviť textu a pracovať priamo s číslami.
W10 64b, Delphi 10.4, FireBird 3.08
Expert na kladenie nejasne formulovaných otázok.

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ěď #18 kdy: 12-02-2013, 16:03:58 »
tak odesel :)

VLAKNO BUDE zrejme SMAZANO pokud se nevrati ...

vsadim se, ze ten breakpoint si do ty funkce RightStr nedal ...
« Poslední změna: 12-02-2013, 16:09:41 od < z > »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #19 kdy: 12-02-2013, 16:57:31 »
VLAKNO BUDE zrejme SMAZANO pokud se nevrati ...
Pockej, jeste to nemaz. Kdyz uz jsem s nim ztratil tolik casu, tak jsem ten jeho obrazek prepsal:
Kód: Delphi [Vybrat]
  1. {$A+,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O-,P+,Q-,R+,S-,T+,U-,V+,W+,X+,Y+,Z1}
  2. {$MINSTACKSIZE $00004000}
  3. {$MAXSTACKSIZE $00100000}
  4. {$IMAGEBASE $00400000}
  5. {$APPTYPE CONSOLE}
  6.  
  7. program Project2;
  8.  
  9.  
  10. uses
  11.   SysUtils, StrUtils;
  12.  
  13. procedure JustAnotherShit(out AParamA,AParamB:string);
  14. var
  15.   b_array_tmp2: array[0..1] of byte;
  16.   s_tmp: string;
  17.   param_a: string;
  18.   param_b: string;
  19.   s: string;
  20. begin
  21.   b_array_tmp2[0] := 1;
  22.   b_array_tmp2[1] := 5;
  23.   s_tmp := '+755+700';
  24.   //
  25.   param_a := LeftStr(s_tmp,b_array_tmp2[1]-1);
  26.   param_b := RightStr(s_tmp,length(s_tmp)- b_array_tmp2[1]+1);
  27.   AParamA := param_a;
  28.   AParamB := param_b;
  29. end;
  30.  
  31. var
  32.   a,b: string;
  33. begin
  34.   JustAnotherShit(a,b);
  35.   writeln(Format('A=%s, B=%s',[a,b]));
  36.   readln;
  37. end.
  38.  

A normalne mi to bezi pocinaje D6Upd3 az po XE3Upd1.  Muzete to taky nekdo vyzkouset ev. zkontrolovat, jestli jsem prepsal to, co bylo na tom obrazku?

Ď.
« Poslední změna: 12-02-2013, 17:00:46 od pf1957 »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #20 kdy: 12-02-2013, 17:02:32 »
tak odesel :)

VLAKNO BUDE zrejme SMAZANO pokud se nevrati ...

vsadim se, ze ten breakpoint si do ty funkce RightStr nedal ...

Neodešel jsem. Žasnu jen nad některýma reakcema, které spíše vypovídají o egu toho dotyčného než o programátorských schopnostech.
Rád bych dodal, že toto není diskuze jak to naprogramovat, ale pozastavení se nad chybou která vznikla.

Když to vezmu popořadě:

1) Už v prvním příspěvku je uvedeno, že jsem si hodnoty v proměnných ověřil pomocí debugeru. Proto mě odpověď abych použil breakpoint a debuger rozladila...
2) to pepak:
RightStr jsem si ověřoval a volá se to správné. Parametry dostává takové jaké jsou v kódu a debuger je toho důkazem. Copy funkce samozřejmě použít jde, tak     jako další možné způsoby. Otázka je, zda-li by to bylo rychlejší než mnou použité fce. Param_b by sice nedopadl podle toho kódu, ale určitě by to šlo přes copy. Proměná se jmenuje poměrně důmyslně: b jako byte, array jako pole a tmp od slova temp protože je to pole na různé blbosti a 2 jako že je těchto pomocných proměnných více.
3) pro < z > ... proč bych si měl dávat breakpoint do funkce s jasným vstupem a výstupem? Jak jsem psal na začátku, jedná se o funkci z StrUtils.
4) to Hruška:
je jedno jestli text nebo čísla. Kód je takový jaký je a chyba by neměla nastat.

...


Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #21 kdy: 12-02-2013, 17:06:32 »
VLAKNO BUDE zrejme SMAZANO pokud se nevrati ...
Pockej, jeste to nemaz. Kdyz uz jsem s nim ztratil tolik casu, tak jsem ten jeho obrazek prepsal:
Kód: Delphi [Vybrat]
  1. {$A+,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O-,P+,Q-,R+,S-,T+,U-,V+,W+,X+,Y+,Z1}
  2. {$MINSTACKSIZE $00004000}
  3. {$MAXSTACKSIZE $00100000}
  4. {$IMAGEBASE $00400000}
  5. {$APPTYPE CONSOLE}
  6.  
  7. program Project2;
  8.  
  9.  
  10. uses
  11.   SysUtils, StrUtils;
  12.  
  13. procedure JustAnotherShit(out AParamA,AParamB:string);
  14. var
  15.   b_array_tmp2: array[0..1] of byte;
  16.   s_tmp: string;
  17.   param_a: string;
  18.   param_b: string;
  19.   s: string;
  20. begin
  21.   b_array_tmp2[0] := 1;
  22.   b_array_tmp2[1] := 5;
  23.   s_tmp := '+755+700';
  24.   //
  25.   param_a := LeftStr(s_tmp,b_array_tmp2[1]-1);
  26.   param_b := RightStr(s_tmp,length(s_tmp)- b_array_tmp2[1]+1);
  27.   AParamA := param_a;
  28.   AParamB := param_b;
  29. end;
  30.  
  31. var
  32.   a,b: string;
  33. begin
  34.   JustAnotherShit(a,b);
  35.   writeln(Format('A=%s, B=%s',[a,b]));
  36.   readln;
  37. end.
  38.  

A normalne mi to bezi pocinaje D6Upd3 az po XE3Upd1.  Muzete to taky nekdo vyzkouset ev. zkontrolovat, jestli jsem prepsal to, co bylo na tom obrazku?

Ď.

Vypadá to dobře. Mě to sice schoří na StrToFloat funkci, ale předpokládám, že na výstupu je A=+755 B=+700.... Proto mi nejde do hlavy, proč ta chyba. Jak je možné, že v mém případě RightStr vrátil 5+70 namísto +700 .... hmm?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #22 kdy: 12-02-2013, 17:11:51 »
1) Už v prvním příspěvku je uvedeno, že jsem si hodnoty v proměnných ověřil pomocí debugeru. Proto mě odpověď abych použil breakpoint a debuger rozladila...
[...]
3) pro < z > ... proč bych si měl dávat breakpoint do funkce s jasným vstupem a výstupem? Jak jsem psal na začátku, jedná se o funkci z StrUtils.
ad 1) protoze je to jediny racionalni postup v dane situaci, pokud rozumis strojovemu kodu
ad 3) protoze neni vsechno zlato co s trpyti:  to, ze nekdo nekde deklaroval vstupy a vystupy, nutne neznamena, ze obsah pameti, ktery s temi vstupy a vystupy operuje, odpovida obsahu, ktery byl do pameti zaveden pred startem tvoji aplikace - za predpokladu, ze vis, ze ti to 1000x fungovalo spravne, takze ta zavedene definice byla spravna.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #23 kdy: 12-02-2013, 17:13:30 »
Vypadá to dobře. Mě to sice schoří na StrToFloat funkci, ale předpokládám, že na výstupu je A=+755 B=+700.... Proto mi nejde do hlavy, proč ta chyba. Jak je možné, že v mém případě RightStr vrátil 5+70 namísto +700 .... hmm?
TO je indukovana chyba. Doposud jsi neudelal ani jeden racionalni krok k tomu, abys tu chybu nasel  >:(

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #24 kdy: 12-02-2013, 17:15:02 »
Vypadá to dobře.
A kdybys tohle udelal rovnou u sebe, mohl si byt dal a usetrit spoustu casu jak malovani obrazku, tak planou diskuzi, ze ktere se stejne nechce poucit.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #25 kdy: 12-02-2013, 17:18:18 »
Vypadá to dobře. Mě to sice schoří na StrToFloat funkci, ale předpokládám, že na výstupu je A=+755 B=+700.... Proto mi nejde do hlavy, proč ta chyba. Jak je možné, že v mém případě RightStr vrátil 5+70 namísto +700 .... hmm?
TO je indukovana chyba. Doposud jsi neudelal ani jeden racionalni krok k tomu, abys tu chybu nasel  >:(

Jak tedy tu chybu najít? Podívej se na kód který jsi napsal. V jakém případě by mohlo dojít k tomu aby jsi dostal A=+755 B=+70   ... Může vůbec něco takového nastat? Vždyť kód na obrázku je to samé co jsi sám napsal ... hmm ?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #26 kdy: 12-02-2013, 17:38:46 »
Jak tedy tu chybu najít? Podívej se na kód který jsi napsal. V jakém případě by mohlo dojít k tomu aby jsi dostal A=+755 B=+70   ... Může vůbec něco takového nastat? Vždyť kód na obrázku je to samé co jsi sám napsal ... hmm ?
Tak jeste jednou:
1. ten test, co jsem posilal, u tebe na D6Upd2 normalne chodi, tj, RightString ti neurizne vysledek
2. tvuj program, kde se to projevuje, neni obdobou toho testu, ale je v nem i jiny kod, ktery po startu aplikace bezi pred inkriminovanym kodem
-> z toho se da usuzovat, ze jednou z moznosti je, ze ten kod, ktery je ve tve aplikaci navic oproti testu, dela nejakou neplechu a nekde neco prepise. A pokud se tak deje, muze byt vysledek naprosto nelogicky, takze nemam moc smysl vest dusevni seance, jaka operace vraci takovy vysledek

Na to se muzes primo podivat debuggerem tj. dat si breakpoint do RightStr jak ti radili a nebo tam vtrasovat, Na to potrebujes zapnout ladeni s DCU.
Pak pokud rozumis strojovemu kodu muzes za par vterin zjistit, proc to ztraci tu nulu na konci. Ale otazkou zustane, proc to v testu nedela - takze srovnat trasovanim, co se zmenilo.

Osobne prvni co bych udelal, ze bych zkontroloval, jestli ma prekladac vypnuyou optimalizaci, zapnuty range checking, typed @ atd... a ze mi preklad skonci bezchyb, warningu a hintu.
Pak bych vzal memory debugger tj. FastMM, nastavil mu full debug mode a aplikaci spustil, pracoval s ni a ukoncil. Pak bych se podival do logu, v jakem stavu mam memory management, jestli nemam memory leaky, jestli neco neuvolnuju dvakrat, jestli nesaha na uvolneny objekt etc...
Jinymi slovy: mobilizoval bych vsechny prostredku na strane prekladace a debuggeryu, ktery mi pomohou odhalit moje chyby.

No a to by pro zacatek stacilo.

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 576
  • Karma: 25
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #27 kdy: 12-02-2013, 17:39:13 »
Jak tedy tu chybu najít? Podívej se na kód který jsi napsal. V jakém případě by mohlo dojít k tomu aby jsi dostal A=+755 B=+70   ... Může vůbec něco takového nastat? Vždyť kód na obrázku je to samé co jsi sám napsal ... hmm ?

treba v tom stringu vůbec nemáš to, co si myslíš, některé znaky nejsou ani normálně viditelné. Prostě si zkus někam vypsat jednotlivé znaky na jednotlivých pozicích (třeba cyklem od 1 do délky stringu) a podívej se, co tam je. To by mělo být vidět i normálně v debuggeru.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #28 kdy: 12-02-2013, 18:02:41 »
Jak tedy tu chybu najít? Podívej se na kód který jsi napsal. V jakém případě by mohlo dojít k tomu aby jsi dostal A=+755 B=+70   ... Může vůbec něco takového nastat? Vždyť kód na obrázku je to samé co jsi sám napsal ... hmm ?
Tak jeste jednou:
1. ten test, co jsem posilal, u tebe na D6Upd2 normalne chodi, tj, RightString ti neurizne vysledek
2. tvuj program, kde se to projevuje, neni obdobou toho testu, ale je v nem i jiny kod, ktery po startu aplikace bezi pred inkriminovanym kodem
-> z toho se da usuzovat, ze jednou z moznosti je, ze ten kod, ktery je ve tve aplikaci navic oproti testu, dela nejakou neplechu a nekde neco prepise. A pokud se tak deje, muze byt vysledek naprosto nelogicky, takze nemam moc smysl vest dusevni seance, jaka operace vraci takovy vysledek

Na to se muzes primo podivat debuggerem tj. dat si breakpoint do RightStr jak ti radili a nebo tam vtrasovat, Na to potrebujes zapnout ladeni s DCU.
Pak pokud rozumis strojovemu kodu muzes za par vterin zjistit, proc to ztraci tu nulu na konci. Ale otazkou zustane, proc to v testu nedela - takze srovnat trasovanim, co se zmenilo.

Osobne prvni co bych udelal, ze bych zkontroloval, jestli ma prekladac vypnuyou optimalizaci, zapnuty range checking, typed @ atd... a ze mi preklad skonci bezchyb, warningu a hintu.
Pak bych vzal memory debugger tj. FastMM, nastavil mu full debug mode a aplikaci spustil, pracoval s ni a ukoncil. Pak bych se podival do logu, v jakem stavu mam memory management, jestli nemam memory leaky, jestli neco neuvolnuju dvakrat, jestli nesaha na uvolneny objekt etc...
Jinymi slovy: mobilizoval bych vsechny prostredku na strane prekladace a debuggeryu, ktery mi pomohou odhalit moje chyby.

No a to by pro zacatek stacilo.

Zítra se na kód opět podívám. Použití FastMM ve full debug bude problém, uvidím jestli jsem něco nepřehlédl. Kouknu i do toho RightStr ač se jedná o funkci z Delphi.

Offline Alnath

  • Příspěvků: 49
  • Karma: 2
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #29 kdy: 12-02-2013, 18:14:38 »
Možná by bylo opravdu dobré ten tvůj kód opravdu izolovat (v rámci aplikace), abys zjistil, že problém není (primárně) v compileru (D6 nemám, na XE3 to funguje as designed). Druhá věc - bylo by fajn zveřejnit tvé deklarace proměnných. Zatím všichni předpokládáme, že platí
 s_tmp: String
Ale co je strList_tmp[] ? Je to TList nebo array of string? Nebo? Nelítají tam někde nějaké AnsiStringy nebo podobné věci? Nech si vypsat extra do nějaké proměnné Length(s_tmp) i Length(strList_tmp[ i ]) a pošli si je na výstup, ať to vidíš.

Zkusil bych zavolat v dané chvíli ten RightStr ne s s_tmp, ale přímo s tím strList_tmp[ i ] - vrátí to totéž?

Čili - udělej si metodu podobnou té, co už se tu objevila, nasimuluj si ten problém (ale předpokládám, že se ti to nepodaří) a pokud to bude vykazovat chybu i nadále, zveřejni to formou zdrojového kódu (viz ovládání tohoto fóra) a nikoliv nějakého picture (blbě se z toho kopíruje bez OCR...). Poznámky o hodnotách z debuggeru napiš klidně do komentářů v tom kódu. Jinak ti těžko někdo pomůže.
« Poslední změna: 12-02-2013, 18:16:14 od Alnath »