Seite 2 von 2

Re: Parameterübergabe an Prozeduren

Verfasst: 25.09.2017 07:28
von ProgOldie
Ich würde es ja gleich mit einer großen Struktur machen. Es sei denn, dass ist nicht so gedacht.
Doch, es war genauso gedacht. Ich wollte nur vorab an einem einfachen Beispiel die Parameterübergabe mit Referenz verstehen.
Im Übrigen ist die Struktur eine feine Sache: Es bleibt zusammen, was zusammengehört.

Re: Parameterübergabe an Prozeduren

Verfasst: 25.09.2017 09:20
von GPI
man-in-black hat geschrieben:

Code: Alles auswählen

Define x.i,y.s,z.i

Procedure test(*a,*b,*c)
  PokeI(*a,15)
  PokeS(*b,"Teststring")
  PokeI(*c,19)
EndProcedure
Um himmels willen, nicht einfach irgendwohin was "Poke"n - schon gar nicht strings. Strings haben eine größe. Wenn der Ursprungsstring bei *B kleiner ist als das was du "poke"st, dann schreibst du wild in Speicher rum! Selbst bei "*b.string" hätte ich bauchschmerzen beim Schreiben. Die beste Lösung ist imo die von NIC. Es ist auch weniger Fehleranfälliger (vergessen von @ oder feste werte Test(10,30,40) - erzeugt einen ausführbaren Code in Beispiel oben)

Re: Parameterübergabe an Prozeduren

Verfasst: 25.09.2017 14:45
von ts-soft
Selbst bei "*b.string" hätte ich bauchschmerzen beim Schreiben.
Brauchste aber nicht, hier wirkt der Stringmanager von PB!

Aber beim Code von man-in-black haste natürlich recht. Kann man auch selber testen, einfach mal den Purefier anschalten. Pokes
in nicht allocierten Speicher sind immer gefährlich :mrgreen:

Re: Parameterübergabe an Prozeduren

Verfasst: 25.09.2017 17:29
von mk-soft
Wie Demivec geschrieben hat muss ein String ByRef immer ein Strukturtype sein (*Text.String). Anders führt es sonst zum Speicherleck.

oder wie bei API

Code: Alles auswählen

Procedure foo(*text, len)
  Protected sTemp.s
  
  sTemp = "Hello World!"
  PokeS(*text, sTemp, Len) 
  
EndProcedure

len = 6
t1.s = Space(len)
foo(@t1, len)
Debug t1

Re: Parameterübergabe an Prozeduren

Verfasst: 25.09.2017 19:20
von man-in-black
Aber beim Code von man-in-black haste natürlich recht. Kann man auch selber testen, einfach mal den Purefier anschalten. Pokes
in nicht allocierten Speicher sind immer gefährlich
Ging auch nur um die Logik dahinter. Aber ja, vielleicht sollte ich aufpassen, was ich schreibe :D

MFG
MIB