Autor Beitrag
IHops
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Vista
Delphi 7, Delphi 2007
BeitragVerfasst: Mi 11.03.09 18:34 
Hab nach langer Zeit mal wieder was mit Strings zu tun .. das erste mal in Delphi 2007 ...

Folgendes Beispielprogramm:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure Test(sin: stringvar sout: string);
var
  i : integer;
begin
  sout := '';
  for i := 0 to Length(sin)-1 do
    sout := sout + sin[i];
end;


Der Ergebnisstring sout hat am Ende einen Wert, der mit #0 beginnt, d. h. das Ergenis ist ein leerer String.

Auch wenns blöd klingt ... früher gings so ...

Daher die Frage: Wie kann ich Nullterminierte Srings auf die obige Art verknüpfen? Geht das nur über strpas?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 11.03.09 18:36 
Das erste Zeichen eines Strings ist myString[1], und das letzte myString[length(myString)]. Pass mal deine for-Schleife entsprechend an. ;-)

Edit, zur Erklärung: String[0] dürfte das letzte Byte der Längenangabe sein. Bei kurzen Strings dürfte das 0 sein.

_________________
We are, we were and will not be.
AScomp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Mi 11.03.09 18:44 
Der Index beginnt bei Strings bei 1, nicht bei 0. Sprich: das erste Zeichen steht in String[1], das letzte in String[Length(String)].

Ich vermute, das dürfte die Ursache sein.

Edit: War zu langsam. :-(
IHops Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Vista
Delphi 7, Delphi 2007
BeitragVerfasst: Mi 11.03.09 20:44 
OK, danke für die schnelle Antwort ...

... nur ... war das schon immer so? Hab in Erinnerung, dass das erste Zeichen eines Feldes den Index 0 erhält. Zudem bin ich davon ausgegangen, dass bei nullterminierten Strings die Länge gerade nicht vorab gespeichert wird, sondern der String soweit geht, bis ein #0 zu sehen ist.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 11.03.09 20:50 
Ja, das war schon immer so. Felder beginnen bei 0, Strings bei 1. ;-)

In Delphi sind Strings auch nicht unbedingt nullterminiert wie in den C-Sprachen, sondern etwas komplizierter aufgebaut. Z.B. die Längenangabe, die früher in String[0] stand (Pascal-Strings, auf 255 Zeichen beschränkt) und jetzt die 4 Bytes vor String[1] einnimmt. Davor kommt dann noch ein Referenzzähler.

Hat wohl beides Vor- und Nachteile. Mit den nullterminierten Strings kann man (teilweise) schneller arbeiten, dafür gibts in Delphi nicht so oft Overflows, weil jemand wieder was kopiert hat, wo lange keine 0 kommt.

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 11.03.09 20:51 
user profile iconIHops hat folgendes geschrieben Zum zitierten Posting springen:
Zudem bin ich davon ausgegangen, dass bei nullterminierten Strings die Länge gerade nicht vorab gespeichert wird, sondern der String soweit geht, bis ein #0 zu sehen ist.
Dann musst du die aber auch benutzen. Also den Datentyp PChar.
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 11.03.09 20:55 
Nur als Nebenbemerkung; Delphi-Strings haben wie oben beschrieben eine Angabe über die Länge des Strings. Sie sind aber auch immer nullterminiert (wobei #0 nicht als Teil des Strings zählt).
IHops Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26

Vista
Delphi 7, Delphi 2007
BeitragVerfasst: Mi 11.03.09 21:19 
Hm, dann mal danke für die schnelle, prompte Aufklärung ... wieder was gelernt.