Avatar billede lincoln Nybegynder
10. maj 2003 - 13:10 Der 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?)
Avatar billede arne_v Ekspert
10. maj 2003 - 13:24 #1
0..255 er ShortString.

AnsiString er meget længere.

String er enten ShortString eller AnsiString afhængig af compiler setting.

Ifølge dokumentationen har ShortString 2 byte overhead og AnsiString 4
byte overhead.

AnsiString må være 4 byte length.

ShortString må være 1 byte length + 1 byte som jeg ikke ved havd indeholder.

Det fremgår ikke af dokumentationen hvorvidt de fysisk er gemt sidste.

(jeg vile have gættet på at de var gemt først, fordi ellers er det
bøvlet at lave dem ægte variable length).
Avatar billede arne_v Ekspert
10. maj 2003 - 13:24 #2
Og ja en Strng kan accesses med index ligesom et array.
Avatar billede borrisholt Novice
10. maj 2003 - 13:32 #3
Det er ikke korrekt.

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;


Jens B
Avatar billede lincoln Nybegynder
10. maj 2003 - 13:35 #4
Kan du eller nogen andre ikke forklare det med byte length?
Avatar billede borrisholt Novice
10. maj 2003 - 13:59 #5
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.

Jens B
Avatar billede borrisholt Novice
10. maj 2003 - 14:03 #6
Kig lidt på det her :

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;


Jens b
Avatar billede borrisholt Novice
10. maj 2003 - 14:16 #7
Det betyder du relativ simpelt kan lave din egen funktion der "måler" længden af en Streng :

type
  pInteger = ^Integer;

Pascal version :
Function JbLengthPAS(const Value : String) : Integer;
var
  q : pInteger;
begin
  q :=  Pointer(Value);
  dec(q);
  Result := q^;
end;

Assembler version :
Function JbLengthASM(const Value : String) : Integer;
asm
  sub eax, $04
  mov eax,[eax]
end;
Avatar billede borrisholt Novice
10. maj 2003 - 14:22 #8
hov den virker ikke ved en tom streng.

Det gør den her :

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;


Jens B
Avatar billede borrisholt Novice
14. maj 2003 - 08:20 #9
Blev du klogere, eller forvirede jeg dig bare ?
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester