Procedure

Anfängerfragen zum Programmieren mit PureBasic.
Mike0484
Beiträge: 28
Registriert: 26.03.2005 16:10

Procedure

Beitrag von Mike0484 »

Hallo
Ich verstehe einfach nicht wozu man Proceduren braucht bzw. welche funktion sie haben kann mir das einer erklären ? In der hilfe hab ich schon nachgekuckt aber ich verstehe es immernoch nicht. :?

Danke
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag von 125 »

naja du hast einen Programmteil den du immer wieder verwendest oder eine Rechenoperation die du immer wieder verwendest nimmst du eine Procedure.

Code: Alles auswählen

Procedure Mal16(variable.f)
mal16.f=variable*16
ProcedureReturn mal16
EndProcedure

Code: Alles auswählen

Var.f=Mal16(20)
Debug Var
würde 320 zurückgeben :)

Das war jetzt ein Bsp. wo man zwar keine Procedure für braucht aber den Sinn glaube ich Relativ gut erklärt.

mfg
125
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 »

Proceduren sind Unterprogramme und Funktionen (in anderen Sprachen oft getrennt in Function und Sub) und dienen der strukturierten (übersichtlichen) Programmierung. Durch Prozeduren entstehen neue Gültigkeitsbereichte für Variablen (lokale Variablen).

Syntax siehste in dem Beispiel von 125

Gruß
Thomas
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
Mike0484
Beiträge: 28
Registriert: 26.03.2005 16:10

Beitrag von Mike0484 »

Hm.. aber immer wenn ich eine Procedure erstelle funktioniert der Teil in der Procedure nicht mehr, muss man das irgendwie abrufen oder was mache ich da falsch.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Hi Mike

Um einen Fehler zu finden, haben wir ein bisschen wenig informationen, du müsstest vielleicht mal einen teil deines Codes Posten.

Ein möglicher Fehler kann sein, dass du wichtige Variablen nicht als Global deklarierst.

Teste mal das hier

Code: Alles auswählen

x.l=3
Procedure Gibmiraus()
    ProcedureReturn x
endprocedure
Debug Gibmiraus()

Und dann setz mal in die erste Zeile ein "Global x.l" und führ es nochmal aus ;)
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Gisela
Beiträge: 33
Registriert: 02.04.2005 20:03

Beitrag von Gisela »

Sinn und Zweck von Prozeduren sind mir zwar klar, aber gibt es eigentlich deutliche Geschwindigkeitsunterschiede bei der Verwendung von Prozeduren im Vergleich zu GOSUB?

Würde mich wirklich mal interessieren.

Ach bevor ichs vergesse. Bin neu hier als PureBasic-Jünger. Prost Gemeinde.
Mike0484
Beiträge: 28
Registriert: 26.03.2005 16:10

Beitrag von Mike0484 »

Ahhhhhh jetzt hab ichs verstanden, danke :bounce:
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Gisela hat geschrieben:Sinn und Zweck von Prozeduren sind mir zwar klar, aber gibt es eigentlich deutliche Geschwindigkeitsunterschiede bei der Verwendung von Prozeduren im Vergleich zu GOSUB?

Würde mich wirklich mal interessieren.

Ach bevor ichs vergesse. Bin neu hier als PureBasic-Jünger. Prost Gemeinde.
Hier ein Vergleich Procedure und Gosub.

Code: Alles auswählen

Procedure.l Test(Wert,Wert1)
  a=0
  For i=1 To Wert
   For b= 1 To Wert1
    a+1
   Next b
  Next i
  ProcedureReturn a
EndProcedure

StartTime = ElapsedMilliseconds() 
Ergebnis.l=Test(20000,1000) 
ElapsedTime1 = ElapsedMilliseconds()-StartTime 

StartTime = ElapsedMilliseconds()
Gosub test 
ElapsedTime2 = ElapsedMilliseconds()-StartTime


MessageRequester("Vergleicht", "Procedure: "+Str(ElapsedTime1)+" Millisekunden ;"+ Str(Ergebnis)+#LFCR$+"Gosub: "+Str(ElapsedTime2)+" Millisekunden ;"+Str(Ergebnis1))


test:
  a1=0
  For i=1 To 20000
     For b= 1 To 1000
       Ergebnis1+1
     Next b
  Next i
Return
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ich glaube es wäre besser, wenn du die Aufrufgeschwindigkeit testest und nicht die Verarbeitungsgeschwindigkeit. Darin liegt nämlich der Unterschied. Hier ganz klar zu sehen.

Code: Alles auswählen

#Count = 10000000

Global a.l, b.f
Procedure TestProc()
  a + 1
  b * 1.00001
EndProcedure

Time1.l = ElapsedMilliseconds()
  a = 0 : b = 1
  For c.l = 1 To #Count
    TestProc()
  Next
Time1 = ElapsedMilliseconds() - Time1
Debug b

Time2.l = ElapsedMilliseconds()
  a = 0 : b = 1
  For c.l = 1 To #Count
    Gosub TestGosub
  Next
Time2 = ElapsedMilliseconds() - Time2
Debug b

MessageRequester("Vergleich: Proc <> Gosub", "Proc: " + Str(Time1) + " ms" + #CRLF$ + "Gosub: " + Str(Time2) + " ms")

End

TestGosub:
  a + 1
  b * 1.1
Return
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Zudem sollte man auch noch erwähnen, dass die Vorteile von Prozeduren auf anderer Ebene liegen, z.B. bei der Kapselung von Variablen in ihrem eigenen Gültigkeitsbereich, Rückgabewerte, Parameter, Rekursion usw. .
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Antworten