10. maj 2003 - 13:10Der er
7 kommentarer og 2 løsninger
En string er et array, right?
Jeg har formået at forvirre mig selv totalt ved at have spurgt i øst og fået svar i vest, så nu prøver jeg her:
Er en string i Pascal/Delphi i virkeligheden bare et array of char med pladser fra 0 til 255, hvor de sidste to pladser er brugt på to specielle tegn? (Hvilke tegn?)
En string kan indeholde stort det uendeligt mængder karekterer. (Max 2 GB)
Det du snakker om hedder en ShortString, Og det var det det i TP og Delphi 1 hed en String. Det er en Array af chars på i alt 256 pladser. Pladserne 1..255 kan du skrive på, mens på plads 0 ligfer størelsen af strengen.
Prøv etv det her kode :
procedure TForm1.Button1Click(Sender: TObject); var s : ShortString; p : PChar; begin s := 'Her er en hest'; Memo1.Lines.Add(InttoStr(Sizeof(s))); p := @s[1]; Memo1.Lines.Add(char(p^)); p := @s[0]; Memo1.Lines.Add(IntToStr(Integer(p^))); Memo1.Lines.Add(IntToStr(Length(s))); end;
Det er simpelthen mængen af hukommelse der er allokeret til at opbevare længden af stengen
Med en ShortString er det en Byte, og der af følgende bliver længden max 255 karekterer. Og så lige til spørgsmålet om hvad den sidste byte et til så er den en null terminator. Altså #0.
procedure TForm1.Button1Click(Sender: TObject); type pInteger = ^Integer; var s : ShortString; p : PChar; t : String; q : pInteger; begin s := 'Her er en hest'; Memo1.Lines.Add(InttoStr(Sizeof(s))); p := @s[1]; Memo1.Lines.Add(char(p^)); p := @s[0]; Memo1.Lines.Add(IntToStr(Integer(p^))); Memo1.Lines.Add(IntToStr(Length(s)));
t := 'Her er en hest'; q := @t[1]; dec(q); Memo1.Lines.Add(IntToStr(q^)); Memo1.Lines.Add(IntToStr(Length(t))); t := t + t; q := @t[1]; dec(q); Memo1.Lines.Add(IntToStr(q^)); Memo1.Lines.Add(IntToStr(Length(t))); t := t + t; q := @t[1]; dec(q); Memo1.Lines.Add(IntToStr(q^)); Memo1.Lines.Add(IntToStr(Length(t))); t := t + t; q := @t[1]; dec(q); Memo1.Lines.Add(IntToStr(q^)); Memo1.Lines.Add(IntToStr(Length(t))); t := t + t; q := @t[1]; dec(q); Memo1.Lines.Add(IntToStr(q^)); Memo1.Lines.Add(IntToStr(Length(t))); t := t + t; q := @t[1]; dec(q); Memo1.Lines.Add(IntToStr(q^)); Memo1.Lines.Add(IntToStr(Length(t))); t := t + t; q := @t[1]; dec(q); Memo1.Lines.Add(IntToStr(q^)); Memo1.Lines.Add(IntToStr(Length(t))); t := t + t; q := @t[1]; dec(q); Memo1.Lines.Add(IntToStr(q^)); Memo1.Lines.Add(IntToStr(Length(t))); end;
Function JbLengthPAS(const Value : String) : Integer; var q : pInteger; begin Result := 0; q := Pointer(Value); if q = nil then exit; dec(q); Result := q^; end;
Function JbLengthASM(const Value : String) : Integer; asm test eax, eax jz @@Done sub eax, $04 mov eax,[eax] @@Done: end;
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.