Hallo,
Von mir etwas ausführlicher ... und hoffentlich verständlich und so halbwegs fehlerfrei!
1. *VariablenName.s
Das ist etwas, was man so in PureBasic nicht verwenden sollte!
Nie! Niemals! ... auch nicht mit anderen Datentypen!
In der Doku von PureBasic steht folgendes:
PureBasic Hilfe hat geschrieben:Das Verwenden von Pointern (Zeigern) ist möglich, indem Sie einen * vor den Variablen-Namen schreiben. Ein Zeiger ist eine Variable, welche eine Speicheradresse beinhaltet und generell mit einer Struktur verknüpft wird.
==> siehe:
http://www.purebasic.com/german/documen ... emory.html
==> D.h. Dein Beispiel ist nicht repräsentativ, weil
*VariablenName.s nicht verwendet werden soll!
.s ist keine Struktur, sondern ein Basis-Datentyp!
2. [VariablenName.s]
Das ist eine String-Variable! Mit @ kann man die Adresse des Speicherbereichs herausfinden!
Wenn @VariablenName Null ist, dann wurde der String noch nicht initialisiert, also noch kein Speicherbereich zugewiesen. In diesem Fall wird der Inhalt der String-Variablen von PureBasic als Leer-String interpretiert.
Ist @VariablenName ungleich Null, dann beginnt an der angegebenen Adresse der String!
PureBasic-Strings sind Null-terminiert, d.h. Jeder String endet mit einem Chr(0)
Abhängig vom gewählten Compiler-Modus (Unicode oder nicht Unicode), werden Strings als ASCII (1 Byte je Zeichen) oder Unicode (2 Byte je Zeichen) verarbeitet!
Noch ein Hinweis:von mir hat geschrieben:In PureBasic gibt es nichts, was mit dem "ByRef VariablenName As String" in Visual Basic vergleichbar ist!
Ja! Man kann String-Pointer an PureBasic Proceduren übergeben (@VariablenName)!
Ja! Man kann in solchen Proceduren diese Strings auf verschiedene Weise auslesen!
Ja! Man kann in solchen Proceduren diese Strings z.B. mit PokeS verändern,
aber nur unter der Bedingung, dass der String nicht länger wird als der Original-String!
Nein! Man kann in solchen Proceduren diese Strings nicht wie normale String-Variablen behandeln/verwenden.
Nein! Man kann in solchen Proceduren auch die Standard PureBasic String-Funktionen nicht für diese Strings verwenden (nur unter Einschränkungen und mit dem Bewusstsein, dass man damit das interne String-Management durcheinander bringen könnte)!
Der einzige Weg PureBasic Strings ByRef an Prozeduren zu übergeben, ist innerhalb von Strukturen. Siehe Beispiel:
Code: Alles auswählen
Procedure AppendString( *First.String, *Second.String )
*First\s + *Second\s
EndProcedure
Procedure ClearString( *aString.String )
*aString\s = ""
EndProcedure
First.String
Second.String
First\s = "Hello"
Debug First\s
Second\s = ", this was appended to the orignial string without any problems :-)"
AppendString( First, Second )
Debug First\s
Second\s = #CRLF$ + #CRLF$ + "Und noch mehr" + RSet("",1024,"-")
AppendString( First, Second )
Debug First\s
ClearString( First )
Debug #DQUOTE$ + First\s +#DQUOTE$
... also doch was vergleichbares zu ByRef
3. VariablenName.String
Hier wird eine Struktur-Variable definiert, mit folgender Struktur (bereits in PB vordefiniert):
Dabei ist zu Beachten, dass die Größe der Struktur SizeOf(String) in diesem Fall der Größe eines Integers entspricht, weil Innerhalb der Struktur nur der Zeiger auf den Speicherbereich abgelegt wird!
Wird solch eine Struktur-Variable an eine Funktion oder Procedure übergeben, wird immer nur die Basisadresse der Struktur übergeben. D.h. In diesem Fall ist VariablenName identisch mit @VariablenName.
Beispiel:
Code: Alles auswählen
Define VariablenName.String
Debug VariablenName ; gibt die Basis-Adresse der Struktur aus!
Debug @VariablenName ; gibt die Basis-Adresse der Struktur aus!
Debug VariablenName\s ; gibt den Inhalt des Strings aus (noch leer)!
Debug @VariablenName\s ; gibt die Adresse des Strings aus. Null, weil noch leer!
Debug PeekI(@VariablenName); gibt ebenfalls die Adresse des Strings aus! Null, weil noch leer!
VariablenName\s = "Hallo"
Debug VariablenName ; gibt die Basis-Adresse der Struktur aus!
Debug @VariablenName ; gibt die Basis-Adresse der Struktur aus!
Debug VariablenName\s ; gibt den Inhalt des Strings aus!
Debug @VariablenName\s ; gibt die Adresse des Strings aus.
Debug PeekI(@VariablenName); gibt ebenfalls die Adresse des Strings aus!
4. *VariablenName.String
Pointer auf eine Struktur-Variable!
Hinweis: Die Struktur-Variable existiert damit noch nicht! Diese muss erst angelegt werden! Das kann auf unterschiedliche Art und Weise geschehen! Beispiel:
Code: Alles auswählen
Define VariablenName.String
Define *pVariablenName.String
*pVariablenName = @VariablenName
Debug VariablenName ; gibt die Basis-Adresse der Struktur aus!
Debug *pVariablenName ; gibt den Inhalt der Pointer-Variablen aus!
; und damit die Adresse der Struktur-Variablen!
Debug @*pVariablenName ; gibt die Adresse der Pointer-Variablen aus!
Debug *pVariablenName\s ; gibt den Inhalt des Strings aus (noch leer)!
Debug @*pVariablenName\s ; gibt die Adresse des Strings aus. Null, weil noch leer!
Debug PeekI(*pVariablenName) ; gibt ebenfalls die Adresse des Strings aus! Null, weil noch leer!
Debug PeekI(@*pVariablenName) ; gibt den Inhalt der Pointer-Variablen aus
Debug ""
*pVariablenName\s = "Hallo"
Debug VariablenName ; gibt die Basis-Adresse der Struktur aus!
Debug *pVariablenName ; gibt den Inhalt der Pointer-Variablen aus!
; und damit die Adresse der Struktur-Variablen!
Debug @*pVariablenName ; gibt die Adresse der Pointer-Variablen aus!
Debug *pVariablenName\s ; gibt den Inhalt des Strings aus!
Debug @*pVariablenName\s ; gibt die Adresse des Strings aus.
Debug PeekI(*pVariablenName) ; gibt ebenfalls die Adresse des Strings aus!
Debug PeekI(@*pVariablenName) ; gibt den Inhalt der Pointer-Variablen aus
Damit kann ich über den Pointer auf die Struktur-Variable zugreifen und zwar mit derselben Syntax, wie bei der Struktur-Variablen selbst (also mit ...
\s).
Ich hoffe, das reicht erst mal!
Damit hast Du mal genug Stoff, um ein wenig zu testen und zu grübeln
lg,
guido