Mehr als ein Return-Wert in Function

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

BtbN

BeitragDi, März 24, 2009 16:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Was zur folge hätte, dass eventuelle Rechen-arbeit für jeden Return-Wert erneut getätigt würde.
 

Kruemelator

BeitragDi, März 24, 2009 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 24, 2009 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, März 24, 2009 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Wurde doch schon. Gleich der erste Post von da_poller.

BlitzMoritz

BeitragMi, März 25, 2009 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile ) Allerdings fiel mir ein Textzitat aus der "BlitzBasic-Bibel" von Rene Meyer ein, der Gosub nicht generell verteufelt, sondern bei gegebenen Anlass im Kapitel 23.2.12 zur Optimierung (!) sogar favorisiert:
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

BeitragMi, März 25, 2009 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessanter Einwand BlitzMoritz Exclamation

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

Xeres

Moderator

BeitragDo, März 26, 2009 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

FireballFlame

BeitragDo, März 26, 2009 2:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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". Confused
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

BeitragDo, März 26, 2009 2:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group