Seite 2 von 3

Verfasst: 21.05.2007 20:07
von Thorium
Xaby hat geschrieben: Also es funktioniert schon. Allerdings frag ich mich, wo der Unterschied zwischen .l und .Long ist.
Der Unterschied ist das .l ein DoubleWord ist und .Long eine Struktur, welche ein DoubleWord enthält.

Verfasst: 21.05.2007 20:45
von Kaeru Gaman
> Und mit *Variable\l ... wenn man drauf zugreifen will (wenn Longint)

nein.

wenn es ein pointer ist, der als pointer auf eine Long strukturiert ist.
dafür die Structure .LONG

...lies doch mal den beitrag von srod, den ich dir verlinkt hab...

Verfasst: 24.05.2007 10:49
von Little John
So wie es hier für numerische Variablen gezeigt wurde, funktioniert es nicht für Stringvariablen:

Code: Alles auswählen

;-- PB 4.02
EnableExplicit

Procedure Aendere_String (*var.string)
   *var\s + " Welt"   ;-> Invalid memory access.
EndProcedure

Define text.s

text = "Hallo"
Aendere_String(@text)
Debug text
Wie muss obige Prozedur aussehen, damit am Ende "Hallo Welt" angezeigt wird?

Gruß, Little John

Verfasst: 24.05.2007 10:59
von Kaeru Gaman
weiß ich nich genau....

aber ein string ist grundsätzlich schon ein pointer (nämlich in den string-pool)
so wie dus gemacht hast, übergibst du also hier nicht den pointer auf den string,
sondern den pointer auf den pointer.
und an der pointer darfst du natürlich nix hintendran schreiben, deswegen IMA.

Verfasst: 24.05.2007 11:52
von Little John
Danke, Kaeru! Nach Deinem Hinweis habe ich ein bißchen 'rumgespielt, und bin dabei auf folgendes gekommen:

Code: Alles auswählen

;-- PB 4.02
EnableExplicit

Procedure Aendere_String (addr.l)
   Protected *StrPtr.string
   
   *StrPtr = @addr
   *StrPtr\s + " Welt"
EndProcedure

Define text.s

text = "Hallo"
Aendere_String(@text)
Debug text
Das funktioniert soweit, aber frag mich bitte nicht warum. :D
Kann jemand bestätigen, dass das so in Ordnung ist, und nicht zu Speicherlecks oder was-weiß-ich führen kann?
Geht es besser/einfacher?

Gruß, Little John

Verfasst: 24.05.2007 12:20
von ChristianK

Code: Alles auswählen

Procedure Aendere_String (*addr)
     PokeS(*addr,PeekS(*addr)+" Welt")
EndProcedure

Define text.s

text = "Hallo"
Aendere_String(@text)
Debug text 

Verfasst: 24.05.2007 12:34
von Little John
Hallo!
Wie kann man denn sicher sein, dass an der Adresse, wo man den neuen String hinPOKEt, auch genügend Speicherplatz zur Verfügung steht?

Gruß, Little John

Verfasst: 24.05.2007 13:01
von ChristianK
Dass genug Platz da ist musst du schon dafür sorgen. :wink:

Beweis:

Code: Alles auswählen

Procedure Aendere_String (*addr)
     PokeS(*addr,PeekS(*addr)+"############################")
EndProcedure

text$="oooooooooooooooo"
b$="=========================================="

Debug "b$ vorher : "+b$
Aendere_String(@text$)
Debug "b$ nachher: "+b$

Verfasst: 24.05.2007 13:13
von Little John
Dann fehlt da wohl noch was bei Deinem Code? :wink:

Gruß, Little John

Verfasst: 24.05.2007 15:50
von Little John
Ich glaube jetzt hab ich's (entsprechend den Informationen in diesem Thread im englischen Forum). Der Trick ist offenbar, dass man für die Übergabe von Strings by Reference keinen Zeiger auf eine Struktur als Parameter verwendet.

Code: Alles auswählen

;-- PB 4.02
EnableExplicit

Procedure Aendere_String (*str.s)
   ; mit *str.s wird die Adresse des String-Deskriptors an die Prozedur übergeben

   *str + " Welt"
EndProcedure

Define text.s

text = "Hallo"
Aendere_String(@text)
Debug text
Gruß, Little John