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

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
poslední offset stringu
« kdy: 08-08-2018, 19:35:55 »
Dá se zjistit poslední offset stringu jinak než pomocí length? Myslím aby člověk nemusel volat žádnou funkci.
« Poslední změna: 08-08-2018, 19:41:23 od vangog »

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1381
  • Karma: 33
    • Pepak.net
Re:poslední offset stringu
« Odpověď #1 kdy: 08-08-2018, 20:03:21 »
Length je sice formálně funkce, ale fakticky akorát přečte pole s uloženou délkou, tzn. nic se nepočítá.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:poslední offset stringu
« Odpověď #2 kdy: 08-08-2018, 21:45:46 »
Length je sice formálně funkce, ale fakticky akorát přečte pole s uloženou délkou, tzn. nic se nepočítá.

Ale musí se zavolat. Není snad pravda, že zavolání funkce je časově náročnější než kdyby se k této hodnotě přistupovalo přímo?

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2130
  • Karma: 97
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:poslední offset stringu
« Odpověď #3 kdy: 08-08-2018, 21:55:18 »
Length je sice formálně funkce, ale fakticky akorát přečte pole s uloženou délkou, tzn. nic se nepočítá.

Ale musí se zavolat. Není snad pravda, že zavolání funkce je časově náročnější než kdyby se k této hodnotě přistupovalo přímo?

Neres blbosti, pokud nevis proc to chces.

Navic zrovna length je compiler intrinsics, takze kompilator místo volani nejake funkce vygeneruje kod, ktery pristoupi na interni struktury stringu a vrati delku.
Embarcadero MVP - Czech republic

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2130
  • Karma: 97
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:poslední offset stringu
« Odpověď #4 kdy: 08-08-2018, 21:57:32 »
A navic kompilator dokaze funkce vlozit a rozvinout - ale az od D2007. Ale ty mas v podpisu D7.
Embarcadero MVP - Czech republic

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 533
  • Karma: 36
    • Verze Delphi: 10.2
Re:poslední offset stringu
« Odpověď #5 kdy: 08-08-2018, 22:45:45 »
Dá se zjistit poslední offset stringu jinak než pomocí length? Myslím aby člověk nemusel volat žádnou funkci.

V Delphi 6 u klasického stringu to bylo tak, že znak na pozici 0 obsahoval délku stringu (délka mohla být max. 255 znaků). Tj. dalo se psát něco jako ord(s[0]).

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1367
  • Karma: 57
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:poslední offset stringu
« Odpověď #6 kdy: 08-08-2018, 23:02:14 »
Snad (nemam Delphi 7):

Kód: Delphi [Vybrat]
  1. var
  2.   Len: Cardinal;
  3.   Str: AnsiString;
  4. begin
  5.   Len := PCardinal(PByte(Str) - 4)^; // offset ukazatele promenne minus 4 bajty by mela byt delka
  6. end;
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:poslední offset stringu
« Odpověď #7 kdy: 09-08-2018, 03:31:15 »

Neres blbosti, pokud nevis proc to chces.

Navic zrovna length je compiler intrinsics, takze kompilator místo volani nejake funkce vygeneruje kod, ktery pristoupi na interni struktury stringu a vrati delku.

No a proč si to neřekl hned. A jak já to mám vědět, když to není v manuálu na stránce pro tuto funkci...

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1381
  • Karma: 33
    • Pepak.net
Re:poslední offset stringu
« Odpověď #8 kdy: 09-08-2018, 05:45:42 »
V Delphi 6 u klasického stringu to bylo tak, že znak na pozici 0 obsahoval délku stringu (délka mohla být max. 255 znaků). Tj. dalo se psát něco jako ord(s[0]).
Podobně je to i u novějších Delphi a novějších stringů. Ale je blbost na to spoléhat, protože jde o nedokumentované chování, které se může kdykoliv změnit a ty se pak při překladu ani nedozvíš o tom, že nějaká část kódu má problém. Radek má naprostou pravdu, zrovna tohle je zcela nesmyslné řešit.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1381
  • Karma: 33
    • Pepak.net
Re:poslední offset stringu
« Odpověď #9 kdy: 09-08-2018, 05:50:17 »
Snad (nemam Delphi 7):

Kód: Delphi [Vybrat]
  1. var
  2.   Len: Cardinal;
  3.   Str: AnsiString;
  4. begin
  5.   Len := PCardinal(PByte(Str) - 4)^; // offset ukazatele promenne minus 4 bajty by mela byt delka
  6. end;
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.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2332
  • Karma: 125
    • Verze Delphi: D2007, XE3, DX10
Re:poslední offset stringu
« Odpověď #10 kdy: 09-08-2018, 08:13:16 »
V Delphi 6 u klasického stringu to bylo tak, že znak na pozici 0 obsahoval délku stringu (délka mohla být max. 255 znaků). Tj. dalo se psát něco jako ord(s[0]).
To co popisujes stale plati, ale pro typ ShortString...

Ale jen v D1 byl string=shortstring a byl to hodnotovy typ. V D2 udelali prvni revoluci a rekli, ze string=AnsiString, v D2009 ze String=UniCodeString a zmenili string na referencni typ tj. promenna je ukazatal na 1. znak v poli znaku alokovanych na heapu ukoncenych znakem NUL, aby zustala zachovana kompatibilita s C-like retezci a pred pointerem na zapornych offsetech je hlavicka spojena s textem, ktera se lisi pro ANSI a Unicode stringy a kterou potrebuje Delphi pro praci s retezci.  Ta hlavicka je (byvala) nekde deklarovana jako record, jen si nepamatuju kde. Takze neni nutne se uchylovat k pointerove aritmetice.




Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2332
  • Karma: 125
    • Verze Delphi: D2007, XE3, DX10
Re:poslední offset stringu
« Odpověď #11 kdy: 09-08-2018, 08:21:01 »
No a proč si to neřekl hned. A jak já to mám vědět, když to není v manuálu na stránce pro tuto funkci...
Hmm, takze u popisu kazde funkce by se snad melo uvadet, jak funguje pocitac, prekladac apod :o

Ono programovani obecne a optimalizace zvlast predpoklada, ze si nemyslis, ze v pocitaci behaji trpaslici bitici...

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2130
  • Karma: 97
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:poslední offset stringu
« Odpověď #12 kdy: 09-08-2018, 09:13:32 »

Neres blbosti, pokud nevis proc to chces.

Navic zrovna length je compiler intrinsics, takze kompilator místo volani nejake funkce vygeneruje kod, ktery pristoupi na interni struktury stringu a vrati delku.

No a proč si to neřekl hned. A jak já to mám vědět, když to není v manuálu na stránce pro tuto funkci...


Delphi je vyšší jazyk a kompilátor dělá někdy větší akce, taky neřešíš co se stane, když

Kód: Delphi [Vybrat]
  1. var
  2.    s, s2: string;
  3.  
  4. ...
  5.    s:= 'Hey jude';
  6.    s2 := s + '!';  // zde
  7.  

To jsou optimalizace, které se řeší až dojdou jiné možnosti (většinou změna algoritmu) - a nahrazení Length je ještě komplikovanější

Takže otázka nezní jak, ale spíše proč. Protože jak jsem psal a jak psal Pepak - obejítí length je nečitelná operace a navíc získáš jen pár instrukcí. Takže pokud máš problém s rychlostí, tak řešení je spíše nějaké jiné.
Embarcadero MVP - Czech republic

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:poslední offset stringu
« Odpověď #13 kdy: 09-08-2018, 11:05:22 »
Snad (nemam Delphi 7):

Kód: Delphi [Vybrat]
  1. var
  2.   Len: Cardinal;
  3.   Str: AnsiString;
  4. begin
  5.   Len := PCardinal(PByte(Str) - 4)^; // offset ukazatele promenne minus 4 bajty by mela byt delka
  6. end;

Zajímavé. Chápu ale že už to nepotřebuju podle toho co napsal Radek Červinka.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 0
    • Verze Delphi: 7
Re:poslední offset stringu
« Odpověď #14 kdy: 09-08-2018, 11:16:48 »
To co popisujes stale plati, ale pro typ ShortString...

Čtu "its memory is a statically allocated 256 bytes" - to "statically" znamená, že ShortString je alokován do Streamu?

 

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

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

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