Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Mit Zeiger durch String?


sashs - So 01.04.12 13:42
Titel: Mit Zeiger durch String?
Hallo,

ist es bei Delphi möglich einfach mit einem Character-Pointer durch einen String zu navigieren?

Gruß

Sascha


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 01.04.2012 um 14:41


bummi - So 01.04.12 14:57

Du meinst z.B. s[x] := 'A' ??


Gausi - So 01.04.12 15:02

Ich glaube, er meint sowas:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var s: string;
p: PChar;
// ...
s := 'Hallo Welt';
p := PChar(s);

ShowMessage(p);
p := p + 6;
ShowMessage(p);


Ja, das geht. ;-)


sashs - So 01.04.12 16:39

Ich hab noch ganz nachgeschaut, aber das von Gausi scheint das zu sein was ich brauche.
Ich wollte eigentlich noch dazu schreiben, dass ich es so meine, wie in c/c++.

Danke.

Gruß

Sascha


Martok - So 01.04.12 20:33

Es geht, aber du verzichtest auf alle Sicherungsnetze die Delphiprogramme so robust machen.
Wenn du also keine zwingenden Geschwindigkeitsgründe hast, bietet sich der Zugriff per S[index] (siehe user profile iconbummi) eher an.

Nur so als Anmerkung.


sashs - Fr 06.04.12 12:39

Wenn ich auf die Stelle zugreifen möchte, mache ich das ja wie bummi gesagt hat.
Es ist aber wichtig für mich, dass ich durch den String durchlaufen kann. Also ich arbeite den String von vorne nach hinten durch und das was schon abgearbeitet ist brauche ich nicht mehr.
Deshalb wollte ich gerne mit einem Zeiger durchlaufen, weil dieser dann nur noch den unbearbeiteten String hält.

Ok, ich hätte es auch komplett mit bummis Methode machen können. Aber mit dem Zeiger find ich persönlich es schöner.

Gruß

Sascha


Kha - Fr 06.04.12 14:44

user profile iconsashs hat folgendes geschrieben Zum zitierten Posting springen:
Deshalb wollte ich gerne mit einem Zeiger durchlaufen, weil dieser dann nur noch den unbearbeiteten String hält.
...was nur bei einfach verketteten Listen mit Garbage Collection funktioniert. Also sicher nicht in Delphi, da bräuchte man schon Haskell ;) .


jaenicke - Fr 06.04.12 15:38

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconsashs hat folgendes geschrieben Zum zitierten Posting springen:
Deshalb wollte ich gerne mit einem Zeiger durchlaufen, weil dieser dann nur noch den unbearbeiteten String hält.
...was nur bei einfach verketteten Listen mit Garbage Collection funktioniert. Also sicher nicht in Delphi, da bräuchte man schon Haskell ;) .
Wie meinst du das? Natürlich geht das in Delphi. :nixweiss:
Das kannst du auch leicht testen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function Test(const a: string): string;
var
  b: PChar;
begin
  Result := '';
  b := PChar(a);
  while b^ <> #0 do
  begin
    Result := Result + b^;
    ShowMessage(IntToStr(b - @a[1]));
    ShowMessage(b);
    Inc(b);
  end;
end;
Ausgegeben wird die Differenz in Chars der Adresse des aktuellen Zeigers auf das aktuelle Zeichen und der Adresse des ersten Zeichens des Strings. Dementsprechend wird ausgegeben 0, 1, 2, ... usw. ;-)
Zudem wird jeweils der verbleibende String in b ausgeben.


Kha - Fr 06.04.12 18:30

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie meinst du das?
Ich habe "das was schon abgearbeitet ist brauche ich nicht mehr" und "hält nur noch den unbearbeiteten String" im Sinn von Speichermanagement verstanden, aber vielleicht war es auch anders gemeint.


sashs - Fr 06.04.12 19:52

Hallo,

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie meinst du das?
Ich habe "das was schon abgearbeitet ist brauche ich nicht mehr" und "hält nur noch den unbearbeiteten String" im Sinn von Speichermanagement verstanden, aber vielleicht war es auch anders gemeint.

Ich habe mich vielleicht missverständlich ausgedrückt. Es ging mir nicht direkt um den Speicher, sondern um den "Inhalt" der Variablen.

Gruß

Sascha