Seite 4 von 5

Verfasst: 06.06.2007 21:25
von a14xerus
was hat ein simples setzten von "x=5" (was sich mir nicht ganz erschließt, WANN soll denn x = 5 sein?) mit proceduren zu tun???????

Verfasst: 06.06.2007 21:30
von RSBasic
Das habt ihr ja die ganze Zeit gepostet
z.b.
Code von TS-Soft:

Code: Alles auswählen

Global x.l 
Procedure ErhoeheX() 
  x + 1 
EndProcedure 

[b]x = 5 [/b]
Debug x 
ErhoeheX() 
Debug x
etc.
So schluss damit ---------------------
Gute Nacht :!:

Verfasst: 07.06.2007 12:11
von TomTom
huhu alle ^^ also wenn ich das jetzt richtig verstanden habe, möchtet ihr eine variable (x) erst auf 5 tun und mit hilfe der Procedure einen wert addieren oder??

mir ist aufgefallen ihr habet etwas vergessen zu schreiben...

Code: Alles auswählen

Procedure.d erhoehex(x)   ;dieses x was in der klammer ist.
  x =x +1
  ProcedureReturn(x)

EndProcedure


x = 5
Debug x
x = erhoehex(x)
Debug x
:mrgreen: hoffe ich habe es richtig verstanden...

Verfasst: 07.06.2007 12:33
von Andreas_S
Mir ist aufgefallen das du Global x übersehen hast...

Verfasst: 07.06.2007 12:34
von TomTom
@ PBprogger

bei diesem code braucht man kein global x, weil die variable übergeben wird

Verfasst: 07.06.2007 12:36
von Kiffi
@PBprogger

Lieber eine Variable an eine Proc übergeben, als sie global zu deklarieren.

Grüße ... Kiffi

Verfasst: 07.06.2007 12:36
von Andreas_S
Das weiß ich auch aber im vorigem Code...

Du hast geschrieben das wir x als Parameter nicht angegeben haben...

Außerdem hat den Code schon jeder hier gepostet.


@Kiffi

Das mach ich auch immer... Global ist nicht mein Freund. Aber der Code vorher war ja auch nicht von mir... ich hab es nur eeinmal vorgeschlagen.

Verfasst: 07.06.2007 12:41
von mk-soft
Es geht hier wohl um das Verständnis mit den Umgang von Proceduren.

Ohne ProcedureReturn ist es im klassischen Sinn eine Procedure.
Mit ProcedureReturn ist es eine Funktion wie ABS(), etc.

Code: Alles auswählen

; Unsaubere Methode
Global x

Procedure MyAdd()
  
  If x <= 8
    x + 2
  EndIf
  
EndProcedure

; Saubere Methode

Procedure MyAddFunction(Value.l)
  
  If Value <= 8
    Value + 2
  EndIf
  ProcedureReturn Value
  
EndProcedure

Debug MyAdd()
x = MyAddFunction(x)
Debug x
x = MyAddFunction(x)
Debug x
x = MyAddFunction(x)
Debug x
x = MyAddFunction(x)
Debug x
x = MyAddFunction(x)
Debug x
FF :wink:

Edit: Noch ein Beispiel mit Structuren

Code: Alles auswählen


Structure udtMitarbeiter
  Name.s
  Vorname.s
  Stunden.f
  Urlaub.l
EndStructure


Procedure SetNamen(*Mitarbeiter.udtMitarbeiter, Name.s, Vorname.s)
  
  ; Programmfehler abfangen
  If @*Mitarbieter = 0
    ProcedureReturn #False
  EndIf
  ; Daten setzen
  With *Mitarbeiter
    \Name = Name
    \Vorname = Vorname
  EndWith
  
  ProcedureReturn #True
  
EndProcedure

Procedure.s GetNamen(*Mitarbeiter.udtMitarbeiter)
  
  Protected Result.s
  
  ; Programmfehler abfangen
  If @*Mitarbeiter = 0
    ProcedureReturn ""
  EndIf
  ; Daten lesen
  With *Mitarbeiter
    Result = \Name + ", " + \Vorname
  EndWith
  
  ProcedureReturn Result
  
EndProcedure

Procedure AddStunden(*Mitarbeiter.udtMitarbeiter, Stunden.f)
  
  ; Programmfehler abfangen
  If @*Mitarbieter = 0
    ProcedureReturn #False
  EndIf
  ; Daten bearbeiten
  With *Mitarbeiter
    \Stunden + Stunden
  EndWith
  
  ProcedureReturn #True
  
EndProcedure

Procedure SubStunden(*Mitarbeiter.udtMitarbeiter, Stunden.f)
  
  ; Programmfehler abfangen
  If @*Mitarbieter = 0
    ProcedureReturn #False
  EndIf
  ; Daten bearbeiten
  With *Mitarbeiter
    \Stunden - Stunden
  EndWith
  
  ProcedureReturn #True
  
EndProcedure

Procedure.f GetStunden(*Mitarbeiter.udtMitarbeiter)
  
  ; Programmfehler abfangen
  If @*Mitarbieter = 0
    ProcedureReturn 0
  EndIf
  ; Daten bearbeiten
  
  ProcedureReturn *Mitarbeiter\Stunden
  
EndProcedure

; Test
; Mitarbeiter

Global Dim Arbeiter.udtMitarbeiter(10)

SetNamen(Arbeiter(1), "Meyer", "Hans")
SetNamen(Arbeiter(2), "Smith", "John")

Debug GetNamen(Arbeiter(1))
Debug GetNamen(Arbeiter(2))

AddStunden(Arbeiter(1), 8.0)
AddStunden(Arbeiter(1), 8.0)
SubStunden(Arbeiter(1), 4.0)
Debug "Stunden: " + StrF(GetStunden(Arbeiter(1)),2)

Verfasst: 07.06.2007 16:24
von RSBasic
So ihr lieben Programmierer :)
Weil ihr mich nicht versteht, mache ich rasch nen Codebeispiel, was ich genau meine.
Ich habe eigentlich schon alle Informationen zum Verstehen gegeben, aber anscheinend kann ich nicht so gut erklären :wink:
So hier:

Code: Alles auswählen

InitSprite()
InitKeyboard()

Procedure abc() 
  For a=0 To 100 
    x+1 
    Delay(1) 
  Next 
  ProcedureReturn x 
EndProcedure

If OpenScreen(1024,768,32,"Screen-Vorlage")
  
  ClearScreen(RGB(0,0,0))
  
  x=0
  
Repeat
  FlipBuffers()
  
  ClearScreen(RGB(0,0,0))
  
  If StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Default)
    Box(100+x,100,500,500,RGB(50,100,200))
    StopDrawing()
  EndIf
  
  ExamineKeyboard()
  
  If KeyboardPushed(#PB_Key_Right)
    x+1
  EndIf
      
  If KeyboardPushed(#PB_Key_Left)
    x-1
  EndIf
  
  If KeyboardPushed(#PB_Key_Return)
    abc()
  EndIf
  
  If KeyboardReleased(#PB_Key_Escape)
    End
  EndIf
  
  Until Quit=1
  
EndIf
Viel Glück :) :allright:

Verfasst: 07.06.2007 16:28
von ts-soft
Das einzige was sinn macht wäre:

Code: Alles auswählen

   If KeyboardPushed(#PB_Key_Return)
      x=abc()
    EndIf
Wenn Du das Ergebnis der Procedure niemanden zuordnest und die Variable
nicht Global ist, kannste die Procedure nur als Zeitfresser nutzen :mrgreen: