Variable von der Prozedure übergeben

Anfängerfragen zum Programmieren mit PureBasic.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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???????
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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 :!:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
TomTom
Beiträge: 130
Registriert: 18.10.2006 18:47

Beitrag 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...
Pure Basic 4.0
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Mir ist aufgefallen das du Global x übersehen hast...
TomTom
Beiträge: 130
Registriert: 18.10.2006 18:47

Beitrag von TomTom »

@ PBprogger

bei diesem code braucht man kein global x, weil die variable übergeben wird
Pure Basic 4.0
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@PBprogger

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

Grüße ... Kiffi
a²+b²=mc²
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten