Code: Alles auswählen
Procedure Convert(*String.Character)
While *String\C
*String\C + 1
*String + SizeOf(Character)
Wend
EndProcedure
MyString.s = "sdrs"
Convert(@MyString)
Debug MyString
Was ich nun gemacht habe: "*String" ist eine Variable, die auf eine Adresse zeigt. Dies bedeutet, dass ich mittels dieser Variable auf den Inhalt eines jeweiligen Speicherbereichs zugreifen kann. Man nennt diese Variablen auch Zeiger (haben immer ein Sternchen vor dem Name). Der Typ ".Character" gibt an, dass wir mit Hilfe dieses Zeigers auf Buchstaben/Zeichen zugreifen wollen.
Nun kommen wir zur zweiten Zeile: Wenn wir eine Variable vom Typ String übergeben, so wird unser Zeiger auf die Adresse des ersten Buchstabens gesetzt. Wir wollen nun diesen Zeiger über alle Buchstaben springen lassen und zugleich den ASCII-Wert um eins erhöhen (dies macht "*String\C + 1"). Da Jeder String mit einem ASCII-0 endet, können wir eine While-Schleife verwenden, die checkt ob der ASCII-Code Null ist oder nicht. Somit springen wir nicht über das Ende des Strings hinaus.
In der dritten Zeile wird durch "*String\C" auf den ASCII-Wert des aktuellen Buchstabens zugegriffen. Durch "+ 1" erhöhen wir wie bereits erwähnt den ASCII-Wert um eins.
Die letzte Zeile innerhalb der While-Schleife verschiebt nun die Adresse um ein Zeichen weiter. Da der Compiler auch Unicode (2 Bytes) unterstützt, addieren wir mit "SizeOf(Character)", dessen Wert sich nach den Compileroptionen anpasst. D.h. bitte nicht einen Zeiger auf eine Zeichenkette mit "+ 1" verschieben.
Jetzt kommen wir zur verwendung der "Convert"-Prozedur: Zuerst definieren wir eine Variable mit dem Wert "sdrs", wie oben im Beispiel. Da die Prozedur eine Adresse auf den ersten Buchstaben einer Zeichenkette benötigt, müssen wir nun als Parameter "@MyString" angeben. Das Ergebnis ist direkt im Inhalt der Variable enthalten, da wir direkt durch "*String\C" auf den Inhalt der Variable zugegriffen und diesen auch modifiziert haben.
Veranschaulichung:
MyString.s = "sdrs"
Im Speicher:
S, D, R, S, NULL
*String.Character = @MyString
<S>, D, R, S, NULL
*String\C + 1
<T>, D, R, S, NULL
*String + SizeOf(Character)
T, <D>, R, S, NULL
usw...
Ich hoffe, dass das weiter geholfen hat.
Habe mal gerade lust gehabt ein kleines Tutorial für Stringpointers zu schreiben.

Gruß Josef
PB 4.61 | Windows Vista - 32Bit
Homepage
"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß