Pointer und PB 5.11

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
nicolaus
Moderator
Beiträge: 1175
Registriert: 11.09.2004 13:09
Kontaktdaten:

Pointer und PB 5.11

Beitrag 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()
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Pointer und PB 5.11

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Pointer und PB 5.11

Beitrag 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
Antworten