Autor Téma: poslední offset stringu  (Přečteno 771 krát)

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1195
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:poslední offset stringu
« Odpověď #15 kdy: 09-08-2018, 11:19:02 »
A to je přesně ono - tenhle kód projde kompilátorem vždy, bez varování a hintů. Přičemž stačí jakákoliv změna v implementaci stringů a fungovat přestane (co třeba například stringy s 64bitovou délkou?). Já bych velice varoval před tím, něco takového používat.

Pro Delphi 7 se jich chysta spousta ;D
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2268
  • Karma: 122
    • Verze Delphi: D2007, XE3, DX10
Re:poslední offset stringu
« Odpověď #16 kdy: 09-08-2018, 11:20:52 »
Pro Delphi 7 se jich chysta spousta ;D
Tak si predstav, ze to nekdy nekdo bude chtit portovat pod novejsi prekladac...

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1195
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:poslední offset stringu
« Odpověď #17 kdy: 09-08-2018, 11:37:55 »
Pro Delphi 7 se jich chysta spousta ;D
Tak si predstav, ze to nekdy nekdo bude chtit portovat pod novejsi prekladac...

To je ovsem dan za rozhodnuti funkci nevolat (coz muze byt zasluhou neuspokojiveho vysledku profileru; dobra, ne v tomto vlakne).
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2051
  • Karma: 90
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:poslední offset stringu
« Odpověď #18 kdy: 09-08-2018, 12:07:21 »
Pro Delphi 7 se jich chysta spousta ;D
Tak si predstav, ze to nekdy nekdo bude chtit portovat pod novejsi prekladac...

To je ovsem dan za rozhodnuti funkci nevolat (coz muze byt zasluhou neuspokojiveho vysledku profileru; dobra, ne v tomto vlakne).

Tak jsem si s tím dal tu práci a porovnal jsem Length s tim tvojím řešením. Kompilátor pro length vygeneruje cca 30 byte, tvoje řešení je 15 byte. Rozdíl je v tom, že length na začátku dělá test zda je string <> '', protože pak je roven nil (což dělá zhruba těch 15 byte) a vrací 0.

takže
Kód: Delphi [Vybrat]
  1.     s := '';
  2.     Len := PCardinal(PByte(s) - 4)^;
  3.  
spadne na AV.

Gratulky.


Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2268
  • Karma: 122
    • Verze Delphi: D2007, XE3, DX10
Re:poslední offset stringu
« Odpověď #19 kdy: 09-08-2018, 13:12:53 »
praci s retezci.  Ta hlavicka je (byvala) nekde deklarovana jako record, jen si nepamatuju kde. Takze neni nutne se uchylovat k pointerove aritmetice.
Tak nadefinova je stale, ale v implementation sekci unity system. Skoro bych rek, ze kdysi byvala pristupna, ale HOSIP:
Kód: Delphi [Vybrat]
  1.   StrRec = packed record
  2.   {$IF defined(CPU64BITS)}
  3.     _Padding: Integer; // Make 16 byte align for payload..
  4.   {$ENDIF}
  5.     codePage: Word;
  6.     elemSize: Word;
  7.     refCnt: Integer;
  8.     length: Integer;
  9.   end;
  10.  

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1195
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:poslední offset stringu
« Odpověď #20 kdy: 09-08-2018, 13:13:05 »
Neudelal jsem nic vic nez do editoru tady napsal radek kodu podle popisu interni struktury. Omlouvam se, priste radne otestuju! ;)
« Poslední změna: 09-08-2018, 13:37:55 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1357
  • Karma: 31
    • Pepak.net
Re:poslední offset stringu
« Odpověď #21 kdy: 09-08-2018, 13:40:26 »
Pro Delphi 7 se jich chysta spousta ;D
Od člověka, který se ve vedlejším vlákně pohoršuje nad nečitelností "Get" + české slovo, to je obzvlášť pikantní pohled na věc.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1195
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:poslední offset stringu
« Odpověď #22 kdy: 09-08-2018, 13:44:44 »
Pro Delphi 7 se jich chysta spousta ;D
Od člověka, který se ve vedlejším vlákně pohoršuje nad nečitelností "Get" + české slovo, to je obzvlášť pikantní pohled na věc.

Interni struktury jsou implementacni zalezitosti a mohou se s verzemi menit. Nemam pocit (ani informace) ze by se EMBT chystalo ke zmenam Delphi 7 ;) Kdyz us se nekdo rozhodne na ne sahat, musi k tomu mit realny duvod. Ale proc ne, priste pridam velke, tucne varovani (i pro dotaz jak si prostrelit hlavu ;)).

Ohledne srovnani teto reakce s anglo-ceskeho pojmenovani metody, to je michani ruzneho druhu ovoce, rekl bych.
« Poslední změna: 09-08-2018, 13:53:14 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline vangog

  • Plnoletý
  • ***
  • Příspěvků: 219
  • Karma: 0
    • Verze Delphi: 7
Re:poslední offset stringu
« Odpověď #23 kdy: 09-08-2018, 15:41:10 »
Citace: Radek Červinka link=topic=16276.msg101037#msg101037
Rozdíl je v tom, že length na začátku dělá test zda je string <> '', protože pak je roven nil (což dělá zhruba těch 15 byte) a vrací 0.

takže
Kód: Delphi [Vybrat]
  1.     s := '';
  2.     Len := PCardinal(PByte(s) - 4)^;
  3.  
spadne na AV.

Gratulky.

V mém případě pracuji s řetězci, uloženými pod TStringList, kde délka je min 3 znaky. Takže toto by problém nebyl, pokud bych to aplikoval. Zkratka AV znamená co?

Offline Marek Weyda

  • Plnoletý
  • ***
  • Příspěvků: 213
  • Karma: 7
    • Verze Delphi: Delphi 2007, 10.1 Berlin
Re:poslední offset stringu
« Odpověď #24 kdy: 09-08-2018, 15:52:50 »
V mém případě pracuji s řetězci, uloženými pod TStringList, kde délka je min 3 znaky. Takže toto by problém nebyl, pokud bych to aplikoval. Zkratka AV znamená co?

Akademie věd ;D

Pro programátory je ale Access Violation  :)

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: