Variablen-Übergabe an Prozedur

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Variablen-Übergabe an Prozedur

Beitrag von Xaby »

Code: Alles auswählen

EnableExplicit

???? j.l

Procedure MachAPlus3(A.l)
  A+3
EndProcedure


j=0
MachAPlus3(j)
Debug j
Was muss ich tun, damit J den Wert 3 annimmt?
Prozedur mit Rückgabewert schließe ich aus, da ich später mehrere Variablen eingeben möchte, die in der Prozedur verändert werden können.
Ich hab gesehen, dass es mit LinkedLists klappt, aber ich verstehe nicht warum.

Static, Protected, Shared kann ich auch nur in Prozeduren benutzen.

Was gibt es noch außer Global?

In Pascal hat man bei der Prozedur-Deklaration folgendes geschrieben:

Code: Alles auswählen

Procedure MachAPlus3(VAR a:LongInt)
Begin
  inc(a,3)
End;
Sollte a nicht verändert werden können:

Code: Alles auswählen

Procedure MachAPlus3(a:LongInt)
Begin
 inc (a,3)
End;

Beim VAR-Teil kam ein Fehler, wenn man folgendes versucht hatte:
MachAPlus3(5) ; { MachAPlus3() erwartet eine Variable!!! }

Beim unteren Code geht es:
MachAPlus3(5) ; Nur das Ergebnis acht wird keiner merken

Beim oberen Beispiel sah es dann wie folgt aus:

VAR x: LongInt;
x=5
MachAPlus3(x)

- in x steht nun 8


Wie mache ich das richtig in PB?
:roll:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

den pointer übergeben.

[edit]

was mich jetzt wundert, ist, dass es mit nem strukturierten pointer funktioniert, mit einem nackten pointer nicht.

weiß zufällig einer der kollegen, wie es auch mit nem *pointer.l funktionieren würde?

Code: Alles auswählen

EnableExplicit

Procedure DoIt(*Var.long)
  *Var\l + 3
EndProcedure

Define j.l

j=0
DoIt(@j)
Debug j
Zuletzt geändert von Kaeru Gaman am 21.05.2007 12:46, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Einfach ein @ davor und dann geht es? :?
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Hier klappt es:

Code: Alles auswählen

EnableExplicit

Define j.l

Procedure MachAPlus3(*A.long)
  *A\l+3
EndProcedure


j=0

MachAPlus3(@j)

Debug j
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Kann man noch überprüfen, ob der Pointer ein gültiger Pointer ist?

Wenn man das @ vergisstm gibt es ja sonst Fehler ohne Ende :shock:


Wo ist der Unterschied zwischen LONG und L?

Es geht scheinbar nur mit LONG :?
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Wenn der Pointer = 0 ist, ist es ein Fehler. Also:

Code: Alles auswählen

Procedure MachAPlus3(*A.long)
  If *A <> #Null
    *A\l+3
  Else
    Debug "ERROR: Falsche Parameter-Übergame!"
  EndIf
EndProcedure
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Gabs kein BYREF in PureBasic? Wird alles ByVal übergeben, ohne das man das ändern könnte? Wäre hier doch ideal!
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

das ist byRef, wenn man den pointer übergibt.

klar, der pointer wird als wert übergeben,
aber exact genauso funktionieren byRef übergaben in anderen sprachen.

es muss immer ein "wert" übergeben werden, der unterschied ist nur,
ob dieser wert den Inhalt oder die Adresse der Variablen wiedergibt.

PS:
aktuell ein posting von srod zu dem thema:
http://www.purebasic.fr/english/viewtop ... 537#195537
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Beitrag von al90 »

@Xaby

Keine ahnung ob ich dich jetzt richtig verstanden habe, aber meinst Du vllt. sowas ?

Code: Alles auswählen

Procedure MachAPlus3(Value.l) 
  PokeL(Value,PeekL(Value) & $FFFFFFFF + 3)
EndProcedure 

a=5
MachAPlus3(@a)
Debug a
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

@al90

Also es funktioniert schon. Allerdings frag ich mich, wo der Unterschied zwischen .l und .Long ist.

Aber ganz so wichtig ist es nicht mehr. Da es nun genauso funktioniert, wie ich es erhofft habe.

Mit *Variable in der ProzedurDeklaration
Und mit @Variable beim Prozeduraufruf

Und mit *Variable\l ... wenn man drauf zugreifen will (wenn Longint)

:allright:
Kinder an die Macht http://scratch.mit.edu/
Antworten