Variablen-Übergabe an Prozedur

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Little John

Beitrag 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
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag 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 
ChristianK for President
Little John

Beitrag 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
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag 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$
Zuletzt geändert von ChristianK am 24.05.2007 13:13, insgesamt 1-mal geändert.
ChristianK for President
Little John

Beitrag von Little John »

Dann fehlt da wohl noch was bei Deinem Code? :wink:

Gruß, Little John
Little John

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