SWAP als Prozedur

Anfängerfragen zum Programmieren mit PureBasic.
spider84
Beiträge: 76
Registriert: 05.03.2008 03:06

SWAP als Prozedur

Beitrag 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...
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag 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...
Bild + Bild

Bild
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Dare Devil
Beiträge: 237
Registriert: 17.10.2008 18:24
Kontaktdaten:

Beitrag 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...
Bild + Bild

Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

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

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

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

Beitrag von Little John »

Gern geschehen.
Das Thema könnte auch ruhig ausführlicher in der Hilfe behandelt werden.

Gruß, Little John
spider84
Beiträge: 76
Registriert: 05.03.2008 03:06

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

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