Mehr als ein Return-Wert in Function
Übersicht

![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was zur folge hätte, dass eventuelle Rechen-arbeit für jeden Return-Wert erneut getätigt würde. | ||
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das stimmt natürlich.
Eventuell, jenachdem um was es geht könnte man das auch ganz anderes machen, sodass nichts zurück gegeben werden muss. Code: [AUSKLAPPEN] DrawImage bild, wert(0), wert(1)
Function wert(retunrwert) ;Code... Select returnwert Case 0 Return ausgabewert1 Case 1 Return ausgabewert2 End Select End Function das wäre mit Return... Code: [AUSKLAPPEN] malen(bild)
Function malen(bild) ;Code... DrawImage bild, ausgabewert1, ausgabewert2 End Function ...das ohne. Aber das kann man ja nicht immer anwenden. |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Welche art von Werten werden überhaupt zurückgegeben? Und in welchem wertebereich?
Mich wunderts, dass noch niemand in den Raum geworfen hat, mit ein bisschen geschicktem byteshfiting einfach mehrere Werte in einem zurückzugeben. |
||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wurde doch schon. Gleich der erste Post von da_poller. | ||
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Noch ein kurzer Nachtrag zur Gosub/Function-Diskussion:
Natürlich hat D2006 recht. Punkt. Da ich seit Jahren eher in BlitzMax zuhause bin, benutze ich sowieso nur noch Funktionen, Gosub gibt's da gar nicht mehr, vielleicht mit gutem Grund. (Übrigens ist es in BlitzMax kein Problem, dass eine Function ein Array zurückgibt ![]() Zitat: Gosub statt Function
Unterprogramme mit Gosub sind schneller als Funktionen. Parameter lassen sich über globale Variablen übergeben. Allerdings erzeugen viele Unterprogramme oft unübersichtliche Quelltexte. Wird ein Programmteil nur an zwei bis drei Stellen benötigt, lohnt sich eine eigene Funktion meist ohnehin nicht. Ich hab' mal 'nen Test gemacht, und den gleichen (sinnlosen Befehl) 100.000mal auf drei Arten wiederholen lassen: Einmal direkt, zum zweiten über Gosub und zum dritten über eine Function. Das Ergebnis war nicht eindeutig. Eine leichte Tendenz war festzustellen, dass Gosub um ca. 1% schneller ist als die Function. Manchmal war es aber auch umgekehrt, also scheint das Argument der Schnelligkeit für die Praxis nicht wirklich überzeugend zu sein: Code: [AUSKLAPPEN] .Wiederholung
Print "Druecke eine Taste, um den Test zu starten." WaitKey() ;------------------------ Time% = MilliSecs() For i% = 1 To 100000 Unwichtig# = Len("Unsinniger Befehl") * Sqr(Abs(Rand(1,100)*Sin(Rand(0,360)))) Next Print "Direkte Berechnung brauchte " + (MilliSecs()-Time) + " Millisekunden." ;------------------------ Time% = MilliSecs() For i% = 1 To 100000 Gosub Unterprogramm Next Print "Gosub Unterprogramm brauchte " + (MilliSecs()-Time) + " Millisekunden." ;------------------------ Time% = MilliSecs() For i% = 1 To 100000 Funktion() Next Print "Funktion() brauchte " + (MilliSecs()-Time) + " Millisekunden." ;------------------------ Goto Wiederholung ;------------------------ .Unterprogramm Unwichtig# = Len("Unsinniger Befehl") * Sqr(Abs(Rand(1,100)*Sin(Rand(0,360)))) Return ;------------------------ Function Funktion() Unwichtig# = Len("Unsinniger Befehl") * Sqr(Abs(Rand(1,100)*Sin(Rand(0,360)))) End Function |
||
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Interessanter Einwand BlitzMoritz ![]() Habs auf meinem Rechner getestet und da sieht das schon eindeutiger aus (B3D v1.99): DebugLog hat Folgendes geschrieben: Druecke eine Taste, um den Test zu starten.
Direkte Berechnung brauchte 69 Millisekunden. Gosub Unterprogramm brauchte 78 Millisekunden. Funktion() brauchte 88 Millisekunden. Druecke eine Taste, um den Test zu starten. Direkte Berechnung brauchte 70 Millisekunden. Gosub Unterprogramm brauchte 77 Millisekunden. Funktion() brauchte 94 Millisekunden. Druecke eine Taste, um den Test zu starten. Direkte Berechnung brauchte 73 Millisekunden. Gosub Unterprogramm brauchte 83 Millisekunden. Funktion() brauchte 87 Millisekunden. Druecke eine Taste, um den Test zu starten. Direkte Berechnung brauchte 70 Millisekunden. Gosub Unterprogramm brauchte 81 Millisekunden. Funktion() brauchte 92 Millisekunden. Druecke eine Taste, um den Test zu starten. Direkte Berechnung brauchte 70 Millisekunden. Gosub Unterprogramm brauchte 81 Millisekunden. Funktion() brauchte 89 Millisekunden. Druecke eine Taste, um den Test zu starten. Nur jetzt kommts: Das was ich zitierte war der Debugmodus. Normal sieht es wieder anders aus, da kann man es wirklich schwer sagen. mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMoritz hat Folgendes geschrieben: Übrigens ist es in BlitzMax kein Problem, dass eine Function ein Array zurückgibt In BlitzBasic doch auch nicht. Wenn man mal davon absieht, das es im eigentlichen Sinne auch nicht zurückgegeben wird;
Code: [AUSKLAPPEN] Const size=2
Local Werte%[size] foo(Werte) Print Werte[0] Print Werte[1] Print Werte[2] WaitKey() End Function foo(w%[size]) Local i For i = 0 To size w[i] = Rand(1,9) Next End Function Funktioniert, wenn die Größe des Blitzarrays Konstant bleibt... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
FireballFlame |
![]() Antworten mit Zitat ![]() |
---|---|---|
LordChaos hat Folgendes geschrieben: GOTO ist _NIE_ besser (gibt zwar Leute die das behaupten, ist aber ehrlich gesagt Blödsinn). Im Zweifelsfalle lohnt sich immer ne kleine Funktion.
@NightPhoenix: Schonmal an "Exit" gedacht? Das seh ich nicht so. Gotos sind bei mir fast immer das Äquivalent zum break-Label (mehrere Schleifen gleichzeitig verlassen) oder zum continue-Befehl aus Java. Natürlich kann man in solchen Fällen große If-Konstrukte bauen, Abbruchbedingungen mehrmals schreiben, oder Codeschnipsel in Extrafunktionen packen; aber all das finde ich wesentlich unübersichtlicher als ein simples "Goto continue_for". ![]() |
||
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit |
![]() |
PSY |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Blitzmoritz
Da gabs schon zahlreiche Posts drüber, die Geschwindigkeit kannste nicht direkt vergleichen, das hängt von mehreren Faktoren ab. Bei mir wird bei Deinem Code z.B. die Function schneller ausgeführt. Hier mal ein Extremfall zum Verdeutlichen: Lass den Test mal laufen, guck Dir die Werte an, und dann nimm das Semikolon aus der Funktion blibb() mal raus (;local c) Code: [AUSKLAPPEN] Global c
;goto timer1=MilliSecs() For i= 1 To 10000000 Goto blubb .anfang Next timer1=MilliSecs()-timer1 ;gosub timer2=MilliSecs() For i= 1 To 10000000 Gosub blobb Next timer2=MilliSecs()-timer2 ;function timer3=MilliSecs() For i= 1 To 10000000 blibb() Next timer3=MilliSecs()-timer3 ;ergebnis Text 50,100,"goto:"+timer1 Text 150,100,"gosub:"+timer2 Text 250,100,"function:"+timer3 WaitKey .blobb a=a+1 Return .blubb b=b+1 Goto anfang Function blibb() ;Local c c=c+1 End Function L8er, PSY |
||
PSY LABS Games
Coders don't die, they just gosub without return |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group