Autor Beitrag
sashs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: So 01.04.12 13:42 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 01.04.12 14:57 
Du meinst z.B. s[x] := 'A' ??

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8554
Erhaltene Danke: 480

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: So 01.04.12 15:02 
Ich glaube, er meint sowas:
ausblenden 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. ;-)

_________________
We are, we were and will not be.
sashs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
sashs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: 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