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

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #30 kdy: 12-02-2013, 18:47:18 »
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.
Ja bych si to taky zkontroloval - zejmena kdyz bubak umi ve watch okne nastavit v properties memory dump, takze si nic nemusi vypisovat. I co mi leze z length()

Na druhou stranu, jemu to vraci spravny pocet znaku, ale o 1 pozici bliz k zacatktu. A to je divny, kdyz to pocita z length odzadu.

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #31 kdy: 12-02-2013, 21:07:22 »
RightStr jsem si ověřoval a volá se to správné.
No, doufejme. Já pod !ověřením" rozumím to, že si to prokrokuju v CPU view, protože v Pascalu čas od času překladač připraví nepěkné věci. Třeba moje "oblíbené" přetypování const string parametru funkce na AnsiString v Delphi 5 vede na přepsání paměti někde kolem toho stringu, a na to fakt jinak než v CPU view nepřijdeš. Pokud sis to ověřil až takhle důkladně, fajn.

Citace
Parametry dostává takové jaké jsou v kódu a debuger je toho důkazem.
Ty ten důkaz možná máš, my v tomto vláknu ale ne - dal jsi výpis proměnných, ale co my víme, ten klidně mohl pocházet z Watches nebo z Evaluate, a to fakt není směrodatný údaj.

Citace
Proměná se jmenuje poměrně důmyslně:
Pro mě za mě. Pokud máš pocit, že ti to takhle důmyslné a srozumitelné bude připadat i za tři roky, fajn. Naštěstí to není relevantní vůči problému.

Citace
proč bych si měl dávat breakpoint do funkce s jasným vstupem a výstupem?
Protože kompilátor čas od času dělá pěkné blbosti a to, co je "zřejmé", rozhodně není vždycky tím, co se skutečně děje. Kdyby sis tam ten breakpoint dal, tak bys například mohl zjistit, že a) se volá úplně jiná funkce RightStr, že b) dostává pokažené parametry, že c) dostává správné parametry, ale uvnitř zrovna nastává ta správná kombinace optimalizací a vstupů, která vede na nesprávné výstupy, atd. Že to je přímo v RTL není argument, viz to přetypování výše.

Citace
je jedno jestli text nebo čísla. Kód je takový jaký je a chyba by neměla nastat.
Souhlas. A teď otázka za deset bodů: Co je cílem tohoto threadu? a) Postěžovat si na Delphi. b) Najít nějaké řešení. c) Najít důvod, proč tohle řešení v tomto případě nefunguje správně. d) Získat nezávislé ověření od dalších uživatelů, že i jim to blbne. e) ... Z toho, co tady ve vlákně proběhlo, bych si tipoval na odpověď a), která už byla vyřešena.

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #32 kdy: 12-02-2013, 21:09:48 »
Jak tedy tu chybu najít?
Izolování co nejmenší části kódu, ve kterém se ta chyba ještě projeví. FastMM ve Full Debug Mode. Důkladné prokrokování příslušného strojáku. Atd.

Citace
V jakém případě by mohlo dojít k tomu aby jsi dostal A=+755 B=+70
Když to kompilátor blbě zoptimalizuje. Když ti něco přepíše paměť. Jen tak dvě možné příčiny spatra.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #33 kdy: 13-02-2013, 07:50:40 »
Tak chyba se našla. Do uses se dostal unit ktery na mem kompu neexistuje, Delphi ani jiny spravce souboru jej nikde nenajde, ale kompilator to sežere a když se volá RightStr, tak to leze do tohoto neexistujiciho unitu a použije neexistujici funkci a vráti blbost, která se však hodně podobá pravé funkci RightStr, která existuje v StrUtils, je namapovaná, ale patrně neexistující unit > existující unit ...

Dodatek: tak Windowsovský správce souborů jej nenajde, total comander jej našel. Jedná se o IDGlobal který má RightStr taky. Proč jej ale nevidí ani Delphi ... toť otázka. Patrně Delphi využívá stejný mechanizmus vyhledávání jako Windowsy, tj. prý nehledá ve více jak 3 podložkové struktuře ... což je divné, ale asi pravda...



 
« Poslední změna: 13-02-2013, 08:08:01 od age.new »

Offline Alnath

  • Příspěvků: 49
  • Karma: 2
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #34 kdy: 13-02-2013, 08:44:12 »
Takže kdybys poslechl některé lidi hned od začátku a prokrokoval jsi to, tak bys zjistil hned na začátku, že je to ve zcela jiné RightStr. OK.

Teď by mě zajímala spíš ta teorie o hledání ve Windows a o třetí úrovni. Jak je to, prosím, myšleno? A o jaké verzi Windows se bavíme? Standardní hledání ve Win nemá pochopitelně žádný problém ani s hledáním na takovéto cestě: "C:\Users\username\Desktop\Nová složka\Nová složka\Nová složka\Nová složka\Nová složka\test.txt", ale pravděpodobně jsi zřejmě myslel něco jiného.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #35 kdy: 13-02-2013, 08:58:50 »
Dodatek: tak Windowsovský správce souborů jej nenajde, total comander jej našel. Jedná se o IDGlobal který má RightStr taky. Proč jej ale nevidí ani Delphi ... toť otázka. Patrně Delphi využívá stejný mechanizmus vyhledávání jako Windowsy, tj. prý nehledá ve více jak 3 podložkové struktuře ... což je divné, ale asi pravda...
Hmmm... clovece, kolik je ti let, ze si nedas poradit, na rady reagujes podrazdene a chyby hledas vsude mozne, jen ne u sebe?  :o

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #36 kdy: 13-02-2013, 09:21:02 »
Dodatek: tak Windowsovský správce souborů jej nenajde, total comander jej našel. Jedná se o IDGlobal který má RightStr taky. Proč jej ale nevidí ani Delphi ... toť otázka. Patrně Delphi využívá stejný mechanizmus vyhledávání jako Windowsy, tj. prý nehledá ve více jak 3 podložkové struktuře ... což je divné, ale asi pravda...
Hmmm... clovece, kolik je ti let, ze si nedas poradit, na rady reagujes podrazdene a chyby hledas vsude mozne, jen ne u sebe?  :o

Podrážděně? Si přečti svoje příspěvky. Od prvních řádků se jen vytahuješ... což je ale normální - na každém fóru jsou egoističtí typy. To že ti uniká smysl diskuze, komunity a fóra celkově je pouze známka toho, že si zde žehlíš nějaký osobní problém... přečti si ještě jednou komplet vše od začátku, bude to tak nejlepší!

... k tomu vyhledávání. Je to zajímavé, že Delphi IDGlobal nevidí, ač jej kompilátor vezme. Používám Windows XP SP3. Když hledání nasměřuji na určitý adresář, tak hledání projde, ale nějak se mi nezdá když hledám stejný soubor na celém disku C.


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ěď #37 kdy: 13-02-2013, 09:39:25 »
a zas hledas chybu v nekom jinem :)
pf1957 ti jen naznacil, ze obrazky v programovani jsou k nicemu

a ja se jen normalne ptal, jestli umis pouzit breakpoint ... a hle, stacilo to :D

Offline Mi.Chal.

  • Guru
  • *****
  • Příspěvků: 576
  • Karma: 25
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #38 kdy: 13-02-2013, 09:41:55 »
Teď by mě zajímala spíš ta teorie o hledání ve Windows a o třetí úrovni. Jak je to, prosím, myšleno? A o jaké verzi Windows se bavíme? Standardní hledání ve Win nemá pochopitelně žádný problém ani s hledáním na takovéto cestě: "C:\Users\username\Desktop\Nová složka\Nová složka\Nová složka\Nová složka\Nová složka\test.txt", ale pravděpodobně jsi zřejmě myslel něco jiného.

Jak hledání nevím, ale existují různé funkce pro přístup k souborům a ty starší mají omezené cesty na 256 znaků. Takže třeba nelze vlézt nebo smazat adresář zadaný plnou cestou, pokud je dostatečně hluboko. Pokud je používá třeba nějaký file manager, tak je možné, že to prostě nebude hledat všude.

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #39 kdy: 13-02-2013, 09:43:48 »
... k tomu vyhledávání. Je to zajímavé, že Delphi IDGlobal nevidí, ač jej kompilátor vezme.
Znovu narážíme na to, že nějaký jev vyhodnocuješ podle dojmů, ne podle ověřených skutečností. Kdyby "Delphi IDGlobal neviděly", tak ti to nepůjde zkompilovat, protože ti kompilátor vynadá, že nemůže najít unitu. Není to spíš tak, že ty na IDGlobal klikáš s Ctrl a protože Delphi odmítají otevřít zdroják, tak z toho usuzuješ, že tu unitu nevidí? Protože to je něco jiného - to je prostě jen problém v editoru, že nedokáže ten zdroják správně najít, což je celkem běžné (zejména v případech, kdy máš k dispozici jen .dcu bez zdrojáků). -- Fakt si na to dávej pozor, potom nemáš v některých případech šanci najít příčinu problémů.

Citace
Používám Windows XP SP3. Když hledání nasměřuji na určitý adresář, tak hledání projde, ale nějak se mi nezdá když hledám stejný soubor na celém disku C.
Explorer má tendenci spoustu věcí maskovat a předělávat. Od skrývání přípon v názvech souborů až po skrývání těch souborů samotných. To, co Explorer vypíše, nelze považovat za fakt, ať už je Explorerův závěr pozitivní nebo negativní.

Offline Alnath

  • Příspěvků: 49
  • Karma: 2
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #40 kdy: 13-02-2013, 09:48:39 »
... k tomu vyhledávání. Je to zajímavé, že Delphi IDGlobal nevidí, ač jej kompilátor vezme. Používám Windows XP SP3. Když hledání nasměřuji na určitý adresář, tak hledání projde, ale nějak se mi nezdá když hledám stejný soubor na celém disku C.

Vyhledávání v XP samozřejmě funguje zcela bez problémů, pokud je soubor dostupný pro parametry hledání (například je zvoleno hledat systémové a skryté soubory, aby se obešla možnost, že soubor má nastavený nějaký takovýto atribut) - něco podobného zmínil už Pepak. Kdyby to tak v XP nefungovalo, bylo by poměrně značné procento lidí dost v háji :) Ale můžeš zkusit poslat ten soubor sem do fóra, napsat k němu přesně cestu, na jaké u tebe leží a já tady zkusím najít nějakou mašinku s XP a zkusím to nasimulovat. Třeba je ta cesta delší než 255 znaků...

Jinak IDGlobal (starší verze Indy) opravdu má funkci RightStr a když ji porovnáš s RightStr z Delphi, tak uvidíš, kde je v tom IDGlobal chyba (zapomenou tam +1). A jak už tu psal správně Pepak - kdyby Delphi tu unitu neviděly (a máš ji v Uses), tak by řvaly jak na lesy...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3343
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #41 kdy: 13-02-2013, 09:51:26 »
Podrážděně? Si přečti svoje příspěvky. Od prvních řádků se jen vytahuješ... což je ale normální - na každém fóru jsou egoističtí typy. To že ti uniká smysl diskuze, komunity a fóra celkově je pouze známka toho, že si zde žehlíš nějaký osobní problém... přečti si ještě jednou komplet vše od začátku, bude to tak nejlepší!
Neminim tu vest off topic diskusi na tema mojeho ega, ale co se tyka smyslu fora, tak by sis mel precist klasickou materii http://www.root.cz/texty/jak-se-spravne-ptat/

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #42 kdy: 13-02-2013, 09:55:25 »
a zas hledas chybu v nekom jinem :)
pf1957 ti jen naznacil, ze obrazky v programovani jsou k nicemu

a ja se jen normalne ptal, jestli umis pouzit breakpoint ... a hle, stacilo to :D

Neřeším zde, jak problém opravit. Existuje spoustu způsobů, jak to naprogramovat. Obrázek měl jen jednoduše naznačit problém. Pokud si to někdo neumí v hlavě představit, tak to není můj problém...

k tomu breakpointu ... vzhledem k tomu, že v prvním postu je napsáno jasně a zřetelně, že hodnoty v rpoměnných byly ověřeny pomocí debugeru, tak odpověď stylem "použij breakpoint" připisuji chytrákovi, který si nejen nedbale přečetl první post, ale patrně se nad tím ani nezamyslel...

Jinak je možné, že je hledání omezeno i na těch 255 znaků, nevím. Kdybych to věděl, tak bych se o tom nezmiňoval na diskuzi. Jinak chyba Delphi: Unable to locate file ''IdGlobal.pas''... načež jsem dal hledání přes start na disku C a to taky nic nenašlo. Kompilátor chybu nezahlásil a funkce RightStr se provedla, ač jediná "existence" této funkce je ve StrUtils...



Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #43 kdy: 13-02-2013, 10:02:19 »
Jinak chyba Delphi: Unable to locate file ''IdGlobal.pas''... načež jsem dal hledání přes start na disku C a to taky nic nenašlo. Kompilátor chybu nezahlásil a funkce RightStr se provedla, ač jediná "existence" této funkce je ve StrUtils...
Pokud Delphi při kompilaci nenajdou požadovaný soubor.pas, tak se dívají, jestli by třeba náhodou nenašly soubor.dcu...

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 0
Re:Máte pro tuto chybu logické vysvětlení?
« Odpověď #44 kdy: 13-02-2013, 10:06:27 »
Jinak chyba Delphi: Unable to locate file ''IdGlobal.pas''... načež jsem dal hledání přes start na disku C a to taky nic nenašlo. Kompilátor chybu nezahlásil a funkce RightStr se provedla, ač jediná "existence" této funkce je ve StrUtils...
Pokud Delphi při kompilaci nenajdou požadovaný soubor.pas, tak se dívají, jestli by třeba náhodou nenašly soubor.dcu...

Pokus: zkuste někdo vytvořit novou aplikace a do interface > uses napište IdGlobal ... a pak na něj najeďte myší, klikněte pravým tlačítkem a vyberte FindDeclaration .... najde?