AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zum Aufbau eines Strings

Ein Thema von SebE · begonnen am 16. Jan 2005 · letzter Beitrag vom 16. Jan 2005
Antwort Antwort
Seite 1 von 2  1 2      
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#1

Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:11
Hi,
meine Frage ist folgende:
Warum kann man bei einem String NICHT auf das "0"te Zeichen zugreifen?
Was ist darin gespeichert?

Mein Lehrer sagte die Länge des Strings. -> Wie kann ich diese Auslesen??

Danke für Erklärungen
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:17
Also die Länge steht da definitiv nicht.
Dann das 0te Element ist ja nur 1 Byte und in einem Byte könnte man maximal eine Länge von 255 Zeichen vermerken, ein String kann aber bis zu 4 GB groß sein. Aber ungefähr hat dein Lehrer recht, es hat was mit der Längenangabe des Strings zu tun. Delphi hat für Strings eine eigene Speicherverwaltung, deswegen kann es auch wunderschön krachen wenn du zwischen DLL und Hauptprogramm mit String arbeitest (ohne ShareMem) weil dann einfach die Delphieigene Speicherverwaltung nicht ganz stimmt..

Kurz und knapp: ich hab keine Ahnung was dort genau drin steht, aber die Länge wird auf dem einen Byte kaum gespeichert sein.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#3

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:21
Zu den "255" in einem Byte hast du Recht.
Es könnte ja sein, dass das nicht als Zahl, sondern als Zeichen gespeichert wird.

Kurz:
String[0]:=Chr(Länge des Strings)

Ich dachte, ich hätte das ma irgendwo gesehen
vielleicht auch nur geträumt
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:22
Hi,

unter Turbo Pascal war in [0] die Länge von Strings gespeichert.
Ein String war damals noch in etwa ein array[Byte] of Char

Beim Typ "ShortString" von Delphi dürfte das immernoch so sein.

Der neue HugeString ("String") hat seine Länge in 4 Bytes gespeichert, an die Du, genauso wie an den Referenzzähler, nicht ohne Umwege rankommst. Da musst Du immer Length() verwenden.

Nur noch zur Info :
In "String[-8]" steckt der Referenzzähler und in "String[-4]" steckt der Längenzähler.
Ich habe das mal in Anführungszeichen gesetzt, weil Du ja nicht so darauf zugreifen kannst

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:23
ja eben, wenn es mit "chr(Laenge)" gespeichert wird so kann die Länge höchsens 255 sein. Wenn die Zahl größer ist würde mehr benötigt und somit würde das ganze ja in StringVariable[1] weitergehen was nicht der fall ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:25
Zitat von mirage228:
Hi,

Nur noch zur Info :
In Length(String)-8 steckt der Referenzzähler und in Length(String)-4 steckt der Längenzähler.
Ist das jetzt verarsche? Wenn nicht, erklärs mal genauer.

Angenommen mein String ist "abcdefghij", dann wäre length (10) - 8 ja 2. Und MeinString[2] zeigt ja dann wohl auf eine andere stelle als auf den Referenzzähler.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:27
Zitat von SirThornberry:
Zitat von mirage228:
Hi,

Nur noch zur Info :
In Length(String)-8 steckt der Referenzzähler und in Length(String)-4 steckt der Längenzähler.
Ist das jetzt verarsche? Wenn nicht, erklärs mal genauer.

Angenommen mein String ist "abcdefghij", dann wäre length (10) - 8 ja 2. Und MeinString[2] zeigt ja dann wohl auf eine andere stelle als auf den Referenzzähler.
Ups ,
hab mich verschieben. Ich meinte an Position -4 und -8 im String sitzen die beiden besagten Werte, also String[-8] und String[-4] in etwa

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#8

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:31
Das stößt aber gegen die "unteren Grenzen" eines Strings:

... :=S[-4];
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:32
Zitat von SebE:
Das stößt aber gegen die "unteren Grenzen" eines Strings:

... :=S[-4];
So geht das natürlich nicht (daher schrieb ich auch "in Etwa"). Man kann nicht direkt auf den Längen- bzw. Referenzzähler zugreifen.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Frage zum Aufbau eines Strings

  Alt 16. Jan 2005, 15:33
Moin!

Das stimmt schon - so wurde es früher gemacht. Die als ShortString bekannten Strings arbeiten immernoch so, daher haben diese eine Beschränkung auf maximal 255 Zeichen und im 0. Zeichen ([0]) steht auch tatsächlich die Länge drin. Und für die heutigen AnsiStrings gilt dies nicht mehr, SirThornberry hat ja schon gut erläutert das man in das Byte keine Längenangabe für 2 GB reinbekommt. Da die Strings aber kompatibel sein sollten so dass die Anwender nicht eine Routine für ShortString und eine für AnsiString schreiben müssen, deshalb gibt es [0] bei AnsiStrings auch noch, nur das hier der Compiler bei einem direktem Zugriff abblockt. Zum Beispiel gibt die Hilfe zu SetLength() an, das sie bei ShortStrings nur das Längenbyte [0] setzt und bei anderen Strings Speicher alloziiert.

@SirThornberry: Die Einschränkung mit String und DLL gilt nur für AnsiString, da diese mit internen Referenzen arbeiten - im Gegensatz dazu hat man mit WideStrings oder ShortStrings keine Probleme (keine Referenzen).

MfG
Muetze1

/EDIT: einmal Pizza aus dem Ofen geholt, schon 5 Posts zu spät...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz