Avatar billede lolle Nybegynder
13. januar 2001 - 19:48 Der er 46 kommentarer og
1 løsning

Total Bytes på en String

Hvordan kan man finde ud af hvor mange bytes en string fylder ?

f.eks. Hej = 9 bytes !
Avatar billede stigc Nybegynder
13. januar 2001 - 19:58 #1
hvad med længden på den!

måske + 2 bytes da sluttegnet i enstreng vist er \"\\o\"

I hvertilfælde i C++
Avatar billede erikjacobsen Ekspert
13. januar 2001 - 20:00 #2
prøv sizeof:

  var a: string;


  showmessage(sizeof(a));
Avatar billede lolle Nybegynder
13. januar 2001 - 20:14 #3
erikjacobsen  -> SizeOf retunere hele tiden 4 !

Så det virker ikke !
Avatar billede stigc Nybegynder
13. januar 2001 - 20:15 #4
Det er vel fordi det er en pointer du prøver med.........
Avatar billede microtec Nybegynder
13. januar 2001 - 20:27 #5
Du bruger bare funktionen LENGTH.
F.eks.

Label1.caption := LENGTH(\'Hej = 9 bytes !\');
Avatar billede microtec Nybegynder
13. januar 2001 - 20:29 #6
stigc >> Man kan godt benytte 0-teminerede stringe i Delphi, men det er ikke det normale.
Avatar billede microtec Nybegynder
13. januar 2001 - 20:31 #7
Så lige at du ville vide TOTAL antal bytes din string fylder. Så skal du lige ligge 1 til resultatet, da der benyttes 1 byte til at gemme længden i.
Altså:

Label1.caption := IntToStr(LENGTH(\'Hej = 9 bytes !\')) + 1;

Jeg glemte også InToStr :o)
Avatar billede stigc Nybegynder
13. januar 2001 - 20:32 #8
så kan en streng ikke være over 255 tegn?
Avatar billede microtec Nybegynder
13. januar 2001 - 20:37 #9
stigc >> Rigtigt. Det er begrænsningen i PASCAL. Derfor kan man nu også benytte 0-terminerede stringe.
Når man erklærer variablen som STRING er det ikke en 0-termineret string. Så skal man have fat i PChar.
Avatar billede lolle Nybegynder
13. januar 2001 - 20:41 #10
microtec -> Det er ikke \"LENGTH\" af ordet jeg vil have men hvor meget det fylder !

Ligesom KileByte/MegaByte
Avatar billede microtec Nybegynder
13. januar 2001 - 20:41 #11
lolle >> \"Afvist svar\"????

Du må vist forklare lidt bedre, hvad det er du gerne vil.
Avatar billede microtec Nybegynder
13. januar 2001 - 20:42 #12
\"LENGTH\" + 1 for tæller i BYTE, hvor meget din string fylder.
Avatar billede lolle Nybegynder
13. januar 2001 - 20:43 #13
Nej det er da bare hvor lang selve tekst strenger er!
Avatar billede microtec Nybegynder
13. januar 2001 - 20:45 #14
Da din string ikke kan være mere end 255 tegn, kommer hverken Kilo Byte eller Mega Byte nogen sinde på tale ;o)
Avatar billede microtec Nybegynder
13. januar 2001 - 20:46 #15
lolle >> PASCAL allocerer dynamisk plads til din string, så det vil være nøjagtigt det samme som \"LENGTH\" + 1.
Avatar billede lolle Nybegynder
13. januar 2001 - 20:47 #16
Det ved jeg !

Men hvis jeg f.eks. sender en string gennem mit prog... Så vil jeg vide hvor meget den fylder i Byte !
Avatar billede lolle Nybegynder
13. januar 2001 - 20:51 #17
Hvis min tekst f.eks er \"lol\" (uden \")

Vil det så være 3 ikk !

Vil det sige at ET tegn fylder 1 Byte ?
Avatar billede microtec Nybegynder
13. januar 2001 - 20:54 #18
lolle >> JA.

Et tegn fylder PRÆCIST 1 byte.
Og så + 1 byte til at gemme stringens længde i.

\'LOL\' fylder altså ialt 4 bytes i din PC´s memory.


Så simpelt er det ;o)
Avatar billede lolle Nybegynder
13. januar 2001 - 20:58 #19
Ok så lige et lille spm !

Hvordan er det man dividere ?

er det ikk bare \"/\"

Men det dur ikk ved mig

f.eks.

var
I,I2: Integer;
begin
I := 24 * 247;
I2 := I / 2;

ShowMSG..(IntToStr(I2));
end;
Avatar billede pstric Nybegynder
13. januar 2001 - 21:02 #20
En Delphi string er reference counted. I adressen inden string\'en er der en værdi, der fortæller hvor mange referencer der er til string\'en.

Eks: Læg to TButton og en TListBox på en form.

Kald den ene BtnAssign og den anden BtnChange. Lav flg. funktioner:

function StringStatus (const Str: string): string;
begin
  Result := \'Adresse: \' + IntToStr (Integer (Str)) +
    \', Længde: \' + IntToStr (Length (Str)) +
    \', Referencer: \' + IntToStr (PInteger (Integer (Str) - 8)^) +
    \', Værdi: \' + Str;
end;

procedure TForm1.BtnAssignClick(Sender: TObject);
begin
  Str1 := \'Hello\';
  Str2 := Str1;
  ListBox1.Items.Add (\'Str2 := Str1;\');
  ListBox1.Items.Add (\'Str1 - \' + StringStatus (Str1));
  ListBox1.Items.Add (\'Str2 - \' + StringStatus (Str2));
  BtnChange.Enabled := True;
end;

procedure TForm1.BtnChangeClick(Sender: TObject);
begin
  Str1 [2] := \'a\';
  ListBox1.Items.Add (\'Str1 [2] := \'\'a\'\'\');
  ListBox1.Items.Add (\'Str1 - \' + StringStatus (Str1));
  ListBox1.Items.Add (\'Str2 - \' + StringStatus (Str2));
end;

Når du klikker på BtnAssign, tildeles en værdi til Str1, og Str2 sættes til at pege på samme string.

Når du klikker på BtnChange, ændres værdien af Str1 fra Hello til Hallo. For at Str2 nu ikke skal ændre værdi, foretager Delphi en Copy-On-Write, fordi Str2 har en Reference Count, der er større end 1.
Avatar billede microtec Nybegynder
13. januar 2001 - 21:07 #21
lolle >> Du kan kun benytte / til division på typerne REAL.
Til Integer skal du benytte DIV

A := B DIV 2;
Avatar billede pstric Nybegynder
13. januar 2001 - 21:07 #22
På grund af alignment kan man ikke sige præcist, at 1 tegn fylder 1 byte. Men det er korrekt, at 4 tegn fylder 4 byte.
Avatar billede microtec Nybegynder
13. januar 2001 - 21:08 #23
DIV benyttes til heltals-typerne
/ benyttes til floating-point typerne
Avatar billede microtec Nybegynder
13. januar 2001 - 21:10 #24
pstric >> Sikke noget vrøvl. Der er ikke nogen alignment i en string.
Avatar billede pstric Nybegynder
13. januar 2001 - 21:13 #25
micro>> nej, men den næste string lægges på en adresse, der er longword-aligned.
Avatar billede microtec Nybegynder
13. januar 2001 - 21:17 #26
pstric >> Nu gik spørgsmålet jo på EN string.
Avatar billede pstric Nybegynder
13. januar 2001 - 21:19 #27
Jeg beklager meget hvis mit svar har skabt forvirring. Jeg læste spørgsmålet som, at lolle gerne ville vide, hvor meget en string FYLDER, ikke hvor lang den er.
Avatar billede microtec Nybegynder
13. januar 2001 - 21:24 #28
pstric >> Det var hvor meget den fylder, mon mon ikke Delphi er så intellegent at den selv sørger for at der ikke blive spild pga. alignment.
Avatar billede microtec Nybegynder
13. januar 2001 - 21:25 #29
pstric >> Du må sgu være assembler programmør, når du tænker på alignment *LOL*
Avatar billede pstric Nybegynder
13. januar 2001 - 21:28 #30
microtec>> Jeg har ikke programmeret i assembler siden Z80-tiden.

Delphi er FOR intelligent til at spare et par ubetydelige bytes *G*
Avatar billede pstric Nybegynder
13. januar 2001 - 21:30 #31
microtec>> men jeg har overvejet at lære 386, så jeg kan forstå alle borrisholt\'s svar.
Avatar billede erikjacobsen Ekspert
13. januar 2001 - 21:36 #32
Det er korrekt, sizeof giver 4 på en String, men ikke på en String[255], f.eks.,
og det er fordi det er en reference. Jeg kender ingen sikker måde til at vide
præcis hvor meget en String reelt fylder, da Delphi selv står for allokeringen.

Til gengæld kan en String i moderne Delphi-er sagtens være længere end
255 tegn, men ikke hvis man skriver String[..et tal..] - der er grænsen netop
255.
Avatar billede microtec Nybegynder
13. januar 2001 - 22:11 #33
erikjacobsen >> Det er rigtigt at der kan arbejdes med sringe der er længere end 255 tegn, men det skal man slå til med et compilerdirektiv, ellers arbejden den som PASCAL gjorde i \"goé gamle dage\", altså max 255 tegn.


Avatar billede pstric Nybegynder
13. januar 2001 - 22:17 #34
microtec>> Det er slået til som default, men du har ret i at det kan slås fra med {$H-} (eller {$LONGSTRINGS OFF})
Avatar billede pstric Nybegynder
13. januar 2001 - 22:19 #35
Der er også en checkbox til det samme:
Project|Options...|Compiler|Syntax Options|Huge Strings
Avatar billede microtec Nybegynder
13. januar 2001 - 22:29 #36
pstric >> Jeg er ret sikke på at det er slået fra default. Jeg har først enablet det for nyligt, netop fordi jeg havde behov for strings, der er længere end 255 tegn og jeg havde ikke lyst til at skulle arbejde med PChars.
Avatar billede pstric Nybegynder
13. januar 2001 - 22:33 #37
okay, der kan være forskel på de forskellige versioner, jeg arbejder med D5
Avatar billede microtec Nybegynder
13. januar 2001 - 22:38 #38
pstric >> Ja, selvfølgelig. Det er nok derfor.
Jeg arbejder med D2 og D3.
Avatar billede pstric Nybegynder
13. januar 2001 - 22:39 #39
Avatar billede microtec Nybegynder
13. januar 2001 - 22:45 #40
Ok, det har de ændret.

Bemærk lige søjlen \"Memory required\",
\"2 to 256 bytes\" for ShortString *LOL*
Avatar billede martinlind Nybegynder
13. januar 2001 - 22:58 #41
En Standart String i Delphi fylder Lenght(String)*8 bit, da en Char en = 1 byte, du skal dog være opmærksom på at WideString fydler mere, se delphi/windows hjælpen for nøjagtig størelse.
Og Sizeof retunere 4 på en string fordi det er en pointer og ikke fordi den er ref. count.
Avatar billede stigc Nybegynder
13. januar 2001 - 23:01 #42
Ha, ha.  I sidder stadigvæk her!

I følge den oversigt fylder en tom streng 2 bytes. Så var mit svar vel rigtig nok, at der er længden + 2 byte!

Det med pointer \"pointerede\" jeg allerede i svar nummer 4........
Avatar billede microtec Nybegynder
13. januar 2001 - 23:08 #43
martinlind >> Ja, og 8 bit kalder man 1 byte, og så er det det samme som jeg har svarret.

Mon ikke vi skal lade være med at forvirrer lolle mere end højest nødvendigt.
Avatar billede microtec Nybegynder
13. januar 2001 - 23:10 #44
martinlind >> Du glemte forøvrigt den byte hvor stringens længde er gemt :o)
Avatar billede pstric Nybegynder
13. januar 2001 - 23:10 #45
he, he, han har sq fortjent det med sådan et forvirrende spørgsmål *G*
Avatar billede microtec Nybegynder
13. januar 2001 - 23:18 #46
pstric >> rolig nu.
Hvis du bemærkede tillægsspørgsmålet med division, vil du se at manden nok er lidt \"grøn\".
Vi er vel allesammen startet på et tidspunkt :o)
Avatar billede pstric Nybegynder
13. januar 2001 - 23:21 #47
Ja, ja, du lagde vel også mærke til de sidste tre tegn (= 3 bytes ;-)
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



IT-JOB

Rambøll Management Consulting

Senior Software Engineer

Netcompany A/S

Software Developer

Capgemini Danmark A/S

Senior SAP S/4HANA Finance Lead