Seite 1 von 1

SWAP als Prozedur

Verfasst: 19.12.2008 16:54
von spider84
Gibts bei Prozeduren ein Call by Reference?
Das hier scheint jedenfalls nicht zu klappen:

Code: Alles auswählen

Global d,e

Procedure tausche(a,b)
  c=a
  a=b
  b=c
EndProcedure

d=5
e=6
tausche(d,e)
Mittlerweile habe ich zwar den SWAP-Befehl entdeckt, aber trotzdem stört mich gerade, dass ich es scheinbar nicht manuell schaffe...

Verfasst: 19.12.2008 16:59
von Dare Devil
Wieso benutzt du nicht ein Macro anstatt einer Prozedur? Dann musst du auch keine globalen Variablen deklarieren:

Code: Alles auswählen

Macro tausche(a,b) 
  c=a 
  a=b 
  b=c 
EndMacro

d=5 
e=6 
tausche(d,e) 


Debug d
Debug e
Und warum das mit der Prozedur nicht geht ist doch klar... Du speicherst den Inhalt in a und b - aber die Varibalen d und e bleiben gleich - du uebergibst nur den Wert an die Prozedur...

Verfasst: 19.12.2008 17:14
von ZeHa
Dare Devil hat geschrieben:Und warum das mit der Prozedur nicht geht ist doch klar... Du speicherst den Inhalt in a und b - aber die Varibalen d und e bleiben gleich - du uebergibst nur den Wert an die Prozedur...
Er fragte ja, ob's auch Call by Reference gibt.

Soweit ich weiß gibt's das aber nur für Strukturen, mit einzelnen Variablen hab ich's bisher auch noch nie hingekriegt. Möglicherweise gibt's hier für aber auch eine Möglichkeit.

Verfasst: 19.12.2008 17:20
von Dare Devil
ZeHa hat geschrieben:
Dare Devil hat geschrieben:Und warum das mit der Prozedur nicht geht ist doch klar... Du speicherst den Inhalt in a und b - aber die Varibalen d und e bleiben gleich - du uebergibst nur den Wert an die Prozedur...
Er fragte ja, ob's auch Call by Reference gibt.

Soweit ich weiß gibt's das aber nur für Strukturen, mit einzelnen Variablen hab ich's bisher auch noch nie hingekriegt. Möglicherweise gibt's hier für aber auch eine Möglichkeit.
Also ich benutze fuer solche Faelle jedenfalls Macros... wuesst jetzt auch nichts, was gegen Benutzung von Macros spricht...

Verfasst: 19.12.2008 17:21
von Kaeru Gaman
das gibts auch für normale Variablen, mit "@" für die Übergabe und "*" für die Pointerbezeichnung.

... aber mit dem swappen der pointer tu ich mich grad schwer, krieg ich jetzt nich hin...


> wuesst jetzt auch nichts, was gegen Benutzung von Macros spricht...

für die Verwendung als Code, nichts.

für die Verwendung als Antwort in diesem thread:
er hat da nicht nach gefragt, sondern wie byRef geht.

Verfasst: 19.12.2008 18:22
von Little John
"Pass by Reference" geht zum Beispiel mit Variablen vom Typ Long so:

Code: Alles auswählen

Procedure mySwap (*a.Long, *b.Long)  ; Long ist eine vordefinierte Struktur!
   Protected c.l
   
   c    = *a\l
   *a\l = *b\l
   *b\l = c
EndProcedure


Define x.l, y.l

x = 3
y = 7
Debug x
Debug y

mySwap(@x, @y)
Debug x
Debug y
Gruß, Little John

Verfasst: 19.12.2008 18:25
von Kaeru Gaman
aye caramba...
jetzt seh ich auch, wo ich mich vertan hab, dass es nich funktioniert hat.
mal sehen, ob ich nächstes mal dran denke. Danke, John.

Verfasst: 19.12.2008 18:43
von Little John
Gern geschehen.
Das Thema könnte auch ruhig ausführlicher in der Hilfe behandelt werden.

Gruß, Little John

Verfasst: 19.12.2008 23:47
von spider84
Danke für die vielen und ausführlichen Antworten!
Mir war es schon fast peinlich die Frage zu stellen, aber ich kam einfach nicht drauf. Dann habe ich SWAP gefunden und gedacht ich höre mir trotzdem mal an wie das funzt - braucht man ja immer mal wieder...
Das Call-by-Reference aber in PureBasic scheinbar so nicht vorgesehen ist (=nur über Umwege erreichbar) hätte ich auch nicht gedacht.

Verfasst: 19.12.2008 23:55
von Kaeru Gaman
âlso, es ist eigentlich kein Umweg.

... es ist eben nur so, dass du es so hinschreiben musst, dass man auch genau sieht was du tust.
die Übergabe von Variablenadressen und das Adressieren über Pointer ist ein ganz grundlegender Bestandteil jeder Programmierung.

in anderen Sprachen tut CallbyRef im Endeffekt genau das selbe, aber es versteckt das hinter dem Begriff.
Vieles wird in so mancher Sprache einfach hinter zusätzlichen schlüsselwörtern versteckt.
Ein guter Programmierer sollte trotzdem wissen, was es tut.