Mehr als ein Return-Wert in Function

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

NightPhoenix

Betreff: Mehr als ein Return-Wert in Function

BeitragDo, März 19, 2009 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie würdet ihr es machen um 3 Werte, die eine Function berechnet zurückzugeben? Per Return kann ich ja nur einen zurückgeben.
Und globalisieren möchte ich die Variablen nicht. Sowas wie ein vielfaches Return wäre das was ich brauche.
Hat jemand einen Vorschlag für mich?

NightPhoenix
 

da_poller

BeitragDo, März 19, 2009 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
return a+":"+b+""+c

in einer string funktion..

Eingeproggt

BeitragDo, März 19, 2009 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder wenns um kleine Zahlen geht, in Größenordnung eines Bytes schau dir das Prinzip der Farbwerte in BB an Wink (ReadPixelFast und weitere)
Edit: Oder du nimmst eine Bank. (Wieso bin ich nicht gleich drauf gekommen...)
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
  • Zuletzt bearbeitet von Eingeproggt am Do, März 19, 2009 22:48, insgesamt einmal bearbeitet

Xaymar

ehemals "Cgamer"

BeitragDo, März 19, 2009 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ein array erstellen mit rückgabewerten deiner funktion und die jeweils am anfang deiner funktion resetten(Dim)
einfachste und schnelle lösung

Mfg CGamer
Warbseite

DAK

BeitragDo, März 19, 2009 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
ansonsten blieben da noch globale variablen
Gewinner der 6. und der 68. BlitzCodeCompo

maximilian

BeitragDo, März 19, 2009 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Type Tupel
 Field value1, value2, value3
End Type


Leider unterstützt BB keine richtigen Tupel. Bei BMax würde ich es wohl über Call by Reference machen.
Variety is the spice of life. One day ignore people, next day annoy them.
 

BIG BUG

BeitragDo, März 19, 2009 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder wie es sonst in BB gemacht ist, einfach für jede Rückgabe eine eigene Funktion benutzen. Siehe z.B. Transform*- und Transformed*-Befehle
Das Zwischenspeichern der Werte kann ja dann in "temporären" globalen Variablen erfolgen.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)
 

Omenaton_2

BeitragFr, März 20, 2009 11:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich benutze niemals Functions.
Ich habe keine Lust schon wieder eine Diskussion über Sinn und Unsinn von Funktionen zu beginnen. Nimmt meine Meinung einfach so hin wie sie ist, ich werde sie nicht ändern und komme so schon seit Jahren sehr gut klar.

Mein Ratschlag :
Mach einfach stat einer Function eine Subrutine. Du springst hin mit Gosub, machst alles was du willst und kehrst mit Return zurück.
Du scheibst, du möchtest die Variablen nicht globalisieren.
Warum nicht, weiß ich nicht, ist aber egal. Wenn ich in meinen Programmen hin und wieder mal eine Variable nur kurzfristig für irgendwelche Zwischenberechnungen brauche, wie das sonst bei anderen Leuten oft in Funktionen der Fall ist, dann nenne ich die Variablen dort entweder sehr kurz wie "a" und "b" was sie deutlich von allen anderen wichtigen Variablen unterscheidet, weil denen gebe ich immer aussagekräftige Namen wie "EquippedShield_ID"
oder,
ich setze an dem Variablen Namen mit Großbuchstaben die Erweiterung "_TMP", für temporär, was gut erkennbar ist und signalisiert, daß der Wert dieser Variable nur temporär aussagekräftig ist, also nicht "echt" global zu gebrauchen ist.
(Und selbstverständlich kann es unmöglich passieren, daß ich eine wichtige globale Variable zufällig mit _TMP enden lasse.) Diese Vorgehensweise hat sich bei mir auch in sehr großen Projekten voll bewährt.

D2006

Administrator

BeitragFr, März 20, 2009 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Du willst keine Diskussion auslösen? Gut. Deine Meinung will ich dir auch nicht ausreden. Aber bitte, bitte: Behalt sie für dich!

Deine Vorgehensweise führt sämtliche Prinzipien der strukturierten Programmierung ad absurdum. Wir sind hier im Beginner-Bereich und du solltest nicht zulassen, dass sich Anfänger so einen Schmarrn ebenfalls angewöhnen.

Mein Hinweise an die Anfänger:
  • Omenaton_2s Beitrag ignorieren
  • Goto und Gosub niemals benutzen!
  • globale Variablen vermeiden oder zumindest spärlich einsetzen!
  • Funktionen mit lokalen Variablen benutzen, denn im Gegensatz zu irgendwelchen "_TMP"-Variablen im Hauptprogramm, verschwinden diese nach Vollendung der Funktion wieder und blockieren nicht unnötig Speicher.


Danke für die Aufmerksamkeit.

EDIT: Ich hatte ja auch noch ne Idee. Ne Bank erstellen, mehrere Werte reinschmeißen und die Bank zurückgeben.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

BladeRunner

Moderator

BeitragFr, März 20, 2009 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktionen helfen Fehler vermeiden, da sie ihren eigenen Datenraum haben.
Klar kann man ohne Funktionen programmieren, früher musste man das ja auch. Aber sie sind praktisch und ich möchte nicht ohne sein.
Gleiches gilt für Types. Sie bieten jede Menge Möglichkeiten wenn man sie zu nutzen weiß.

Man kann ein Auto auch ohne Servo fahren, mit ist es jedoch ein vielfaches leichter. Warum sollte man also den gegebenen Fortschritt nicht zu seinem Vorteil nutzen?
Von daher pflichte ich D2006 vollkommen zu: Mach weiter wie Du es gewohnt bist, aber bitte präg die Neuen nicht mit dem archaischen Krempel, weil sowas wieder rauszukriegen ist schwer.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Jan_

Ehemaliger Admin

BeitragFr, März 20, 2009 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
am besten nen Type erstellen und dann den Type zurückgeben.
between angels and insects

PSY

BeitragFr, März 20, 2009 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich stimme D2006 voll zu, bis auf

D2006 hat Folgendes geschrieben:

[*] Goto niemals benutzen!


Es gibt (seltene) Ausnahmesituationen, in denen sich GOTO anbietet, weil die Alternativen in diesen Situationen entweder extrem umständlich sind oder unsauber.

Beispiel Spiel:


Code: [AUSKLAPPEN]
.SPIELMENÜ
Repeat
   Spielmenü darstellen
   Spiel gestartet? Goto GAME
Forever

.GAME
Repeat
   If pause = False Spiel darstellen Else Pausenbildschirm anzeigen
Until gameover = True

Goto SPIELMENÜ


Ansonsten vermeide ich GOTO und GOSUB auch wie die Pest.
Funktionen sind schön sauber, Variablen die man nur für die Funktionen benötigt sind lokal und "verseuchen" nicht das Hauptprogramm.
Funktionen kann man Werte übergeben und zurückliefern lassen, und sogar optionale Parameter (falls nicht übergeben) festlegen, was extrem hilfreich sein kann.

Ansonsten bin ich auch für Types, um mehrere Variablen zu übergeben. Einfach, sauber, kompakt.

L8er,
PSY
PSY LABS Games
Coders don't die, they just gosub without return

NightPhoenix

BeitragFr, März 20, 2009 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich danke für die vielseitigen Vorschläge Smile
Oh und ich werde Functions trotzdem verwenden Omenaton_2, sind einfach praktisch... ich teile die Meinung deiner Kritiker Wink


*edit*
Ich benutze eigentlich nur bei Pick-Abfragen ein Goto um aus der Schleife rauszuspringen, benötigt sonst unnötig Zeit. Sonst benutze ich Goto aber auch nie.
Liebe Anfänger, Function ist für ein strukturiertes Programm nunmal das Beste Smile
  • Zuletzt bearbeitet von NightPhoenix am Fr, März 20, 2009 16:32, insgesamt einmal bearbeitet

maximilian

BeitragFr, März 20, 2009 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Repeat
   Spielmenü darstellen
   Spiel gestartet? GAME()
Forever

Function GAME()
   Repeat
     If pause = False Spiel darstellen Else Pausenbildschirm anzeigen
   Until gameover = True
End Function


So ist es besser.

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?
Variety is the spice of life. One day ignore people, next day annoy them.

D2006

Administrator

BeitragFr, März 20, 2009 16:33
Antworten mit Zitat
Benutzer-Profile anzeigen
@PSY:
Code: [AUSKLAPPEN]
Const STATE_GAME = 1
Const STATE_PAUSED = 2
Const STATE_MENU = 3

Local gameState = STATE_MENU

While Not KeyHit(1)

   Select gameState
      Case STATE_GAME:
         updateGame()
         drawGame()
      Case STATE_MENU:
         drawMenu()
      ..
   End select

Wend
End
Exakt 42 mal eleganter. :p
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

PSY

BeitragFr, März 20, 2009 16:38
Antworten mit Zitat
Benutzer-Profile anzeigen
@LORD Jap, kann man drüber diskutieren.

Ich habe allerdings die Hauptgamelogik nicht gern in einer (grossen) Funktion, deswegen benutz ich lieber meine Alternative. Der eine Goto-Befehl stört da nicht wirklich.

Aber egal, ich denke Firephoenix hat die Antwort auf seine Frage Very Happy

L8er,
PSY

(edit) sorry D2006, während ich meinen Beitrag schrieb hast Du wohl geposted Very Happy
OK ich stimme zu, Deine Lösung ist natürlich extrem sauber und sollte vllt sogar irgendwo gepinned werden Smile
Allerdings glaub ich, sie ist ca. 23x eleganter hehe Wink


Grüsse,
PSY
PSY LABS Games
Coders don't die, they just gosub without return
 

Gast

BeitragFr, März 20, 2009 17:14
Antworten mit Zitat
Ich stimme PSY zu.
Allerdings nicht mehr so dolle, seit ich C# benutze (Das besteht theoretisch nur aus funktionen, den main() ist auch ene funktion.)
 

BIG BUG

BeitragSo, März 22, 2009 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Gosub und Goto wird hier anscheindend zwar gerne mal in einen Topf geworfen, es sind aber zwei verschiedene Paar Schuhe. Gosub kann durchaus mal praktisch sein und da ja auch immer ein Rücksprung erfolgen muss, verhält es sich tatsächlich ähnlich wie eine Funktion, ohne die Codestruktur wie Goto zu zerstören.

PSYs Rahmenstruktur mit Gosub anstatt Goto wäre durchaus o.k. und ist in den meisten Fällen auch übersichtlicher und weniger Bug-Anfällig als Ds Lösung.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

peacemaker

BeitragDi, März 24, 2009 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
@ flitztuete95: C# ist ein ganz anderes Level, da gibt es nichtmal Funktionen, sondern nur Methoden.

Ansonsten, was das Thema betrifft: Globale Variabeln sind da ganz gefährlich. Wenn du eine Funktion rekursiv aufrufst, können da komische Werte kommen, weil jeder Funktionsaufruf auf den gleichen Bereich, bzw. Variable zugreifen.
~Tehadon~
www.tehadon.de
http://www.blitzforum.de/worklogs/14/
 

Kruemelator

BeitragDi, März 24, 2009 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das Problem immer anders gelöst:
Code: [AUSKLAPPEN]
Function bla(returnwert)
;Code
Select returnwert
Case 0
Return wert1

Case 1
Return wert2

;....

End Select
End Function

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group