Delphi - popis struktury typu string...
Mam taku nezvyklu otazku... existuje niekde podrobny popis struktury typu string? A dalsia otazka... uchovava si niekde typ string dlzku retazca? To ze je nulou ukonceny, to som si vypisal... ak som zacal robit vypis o 4 bajty pred zaciatkom retazca v pamati, tak mi zobrazilo dlzku retazca... da sa to povazovat naozaj za dlzku retazca?
Tiež to vypísalo (tú dĺžku) aj pri PChar, len o 5 byteov pred, čiže nie 4. A to sa mi zdá divné, lebo PChar predsa dĺžku neuchováva a ak je v String aj dĺžka, prečo potom SizeOf() hlási nepravdivú hodnotu (nezaráta 4 byte s dĺžkou reťazca (myslené pri String)?
Pred tým ako to dal Intex sem, sme to totiž riešili spolu cez ICQ.
Struktura Stringu: pp ll s n
pp - 2 byte počítadlo výskytů pro test platnosti.
ll - 2 byte délka stringu s
s - vlastní string o délce ll byte
n - hexa 0x00 - aby to šlo přetypovávat na PChar (není započítávána do ll).
AnsiString může být přece delší než 64kB.
Není to spíš takhle?
-12 Longint with maximum string size.
-8 Longint with reference count.
-4 Longint with actual string size.
0 Actual string, null-terminated.
S tou nulovou pozici to tak presne neni, v prvni bajt je stale obsazen velikosti (kompatibilita s ShortStringem), i kdyz u AnsiStringu nemam smysl
Aby som to este upresnil: po zadani retazca "ahoj" som si dal vypisat obsah pamate typu string, s tym, ze vypis zacal o 4 bajty skor + este 1 bajt pridany na koniec... a vysledok: 04 00 00 00 61 68 6F 6A 00.
To znamena, ze je to tak ako pise JM.
BTW. s takymi vecami by si v programe podla mna pracovat nemal (pouzi memberov danej triedy, alebo prislusne funkcie prekladaca, edit: alebo strukturu definovanu niekde v include subore prekladaca apod. - potom ta nezaujimaju absolutne offsety), ptz. take veci mozu (netvrdim ze musia) zavisiet od verzie prekladaca a dokonca aj od jeho nastaveni, to moze potom jeden kukat ze co ten program stvara ak niekto nieco zmeni v nastaveniach apod.
Mňa to zaujalo kvôli tomu, že ak niekto bude chcieť uložiť fyzicky pamäť do súboru, tak ho SizeOf() oklame a môže v najhoršom prípade zrútiť program pri spätnomn načitávaní. Ale tak ukladať pamäť asi hocikto nechce. Ide o to, že keď ukladám niečo do súboru, zvykol som použiť SizeOf(), ale ako vidím, tak s tým musím opatrne.
Ukladat fyzicky pamat s objektami tried do suboru namiesto nejakej rozumnej struktury suboru je podla mojho nazoru riadna prasarna (v preklade "prasiaren" ).
To v Pascale.
Jaj tak preto to nesedelo.
S tymto urcite nepracujem, bol to iba akysi test. Moze to zavisiet od verzie prekladaca, alebo od jeho nastaveni? To ako...
Ja neviem kde je ten "String" definovany, ale v buducej verzii moze byt trebars ta velkost 64bitova, alebo (teoreticky) ju mozu ovplyvnit nastavenia prekladaca napr. tykajuce sa single-byte / multi-byte (t.j. unicode) stringov apod.
Pisem len vseobecne, a teoreticky, netvrdim ze sa niekedy zmeni zrovna tato struktura, ale programy sa nepisu stylom preskumam si to vypisom pamati, ale pouzijem prislusne metody/funkcie (ktore ak sa ta struktura niekedy zmeni tak sa zmenia tiez) alebo ak prekladac ma niekde tu strukturu definovanu napr. nieco ako _string_struc a potom pouzit _string_struc.length, apod.
(V C/C++ su take veci bezne v *.h suboroch, aj s patricnymi #ifdef zavisiacimi od nastaveni prekladaca).
Vypis pamate tejto dynamickej premennej bol len akymsi testom pre mna a ma iba informativny charakter. Nikde v ziadnom programe to aj tak nevyuzijem. Hovorim, bol to iba test, nic viac. Len ma zaujimalo, ci si tento typ uchovava dlzku svojho retazca...
Ok, v pohode, ja som len na to chcel upozornit
Samozrejme skumaniu a testovaniu sa ziadne medze nekladu...