Seite 1 von 1

Pointer und PB 5.11

Verfasst: 13.06.2013 10:37
von nicolaus
Hallo zusammen,

ich stehe mit PB 5.11 und dem neuen Umgang mit Pointern gerade auf dem Schlauch und verstehe die neuen Pointer einfach nicht.
Kann mir bitte einer das unten stehende Beispiel, welches in PB 5.00 ohne probleme funktioniert mal für PB 5.11 umbauen.
Vieleicht verstehe ich dann die verkomplizierung der Pointer in der BASIC Sprache PB :mrgreen:

Danke und Grüße,
Nico

Beispiel (funktioniert unter PB 5.0, in PB 5.11 nicht):

Code: Alles auswählen

Procedure test_1(*test1.s)
	strTest.s = "Hello"
	*test1 = strTest
EndProcedure
Procedure Test_2()
	Protected myText.s
	myText = Space(1024)
	test_1(@myText)
	Debug myText
EndProcedure

Test_2()

Re: Pointer und PB 5.11

Verfasst: 13.06.2013 11:27
von CSHW89
Hi nicolaus,

an den Pointern wurde doch gar nichts gemacht. Und außerdem kann ich mir nicht vorstellen, dass dieser Code zuvor funktioniert hat (Kann es gerade nicht testen). Aber folgendes sollte in beiden Versionen funktionieren:

Code: Alles auswählen

Procedure test_1(*test1.String)  ; .s macht bei einem Pointer keinen Sinn
   strTest.s = "Hello"
   *test1\s = strTest  ; Du willst nicht den Pointer neu setzen, sondern den Text an die Stelle des Pointers schreiben
EndProcedure
Procedure Test_2()
   Protected myText.s
   myText = Space(1024)
   test_1(@myText)
   Debug myText
EndProcedure

Test_2()
lg Kevin

Re: Pointer und PB 5.11

Verfasst: 13.06.2013 11:45
von matbal
In den älteren Versionen hat PureBasic einen Prozedurparameter wie *variable.s wie einen String behandelt, obwohl hier eigentlich nur die Adresse übergeben wurde. Man konnte also einen String zuweisen oder auch alle String-Funktionen wie Len() damit verwenden.

Dieses Verhalten war nie dokumentiert und auch inkonsistent, da es bei anderen Variablentypen nicht so funktionierte.

Möglich ist folgendes - String in Struktur, da wird der benötigte Speicherplatz erst beim Zuweisen des Textes belegt.

Code: Alles auswählen

Define variable.string

Procedure SchreibeText(*x.string)
   *x\s = "Guten Tag"   
EndProcedure

Debug variable\s
Wenn die Adresse des Zielspeichers schon übergeben wird, kann man PokeS verwenden

Code: Alles auswählen

Define Variable.s = Space(500)

Procedure SchreibeText(adresse)
   PokeS(adresse, "Guten Tag")
EndProcedure

SchreibeText(@Variable)

Debug Variable
Oder auch so:

Code: Alles auswählen

Define Variable.s = Space(500)

Procedure SchreibeText(adresse)
   *s.string = @adresse
   *s\s = "Guten Tag"
EndProcedure

SchreibeText(@Variable)

Debug Variable