Wie funkioniert das mit den Funktionen ?
Übersicht

![]() |
Bura.TinoBetreff: Wie funkioniert das mit den Funktionen ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi.
Ich steh gerade total auf dem Schlauch und hab jetzt schon mehrere Stunden rumprobiert und das Forum durchsucht. Leider bin ich auf keine Lösung gestoßen und versteh einfach grad nicht wieso das nicht funktioniert. Folgendes Problem: Einer Funktion werden zwei Werte übergeben. In dieser Funktion werden diese (als global deklarierten) Variablen verändert und sollen dann außerhalb der Funktion weiterverwendet werden. Hier mal ein kleines Beispielprogramm: Code: [AUSKLAPPEN] Global Va,Vb
While Not KeyHit(1) Cls Test(VariableA,VariableB) VariableA=Va VariableB=Vb Text 0, 0,"VariableA = "+VariableA Text 0,20,"VariableB = "+VariableB Flip Wend End Function Test(Va,Vb) Va=Va+1 Vb=Vb+2 End Function Nach meinem Verständnis müsste das doch funktionieren, aber das tut es nicht. Wo liegt den der Fehler den ich übersehe ? |
||
![]() ![]() |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Siehe hier Function![]() So wie du es vor hast ginge, wenn die Variablen als Global deklariert wären, was aber den Sinn von Funktionen im Grunde unsinnig macht. Also zumindest dann, wenn man nur noch so vor geht. Der große Vorteil ist eben, dass Funktionen einen eigenen Variablenbereich haben, was sauberes Programmieren erlaubt. Ansonsten könntest du auch auf Gosub ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da würde ich jetzt ma wiedersprechen wollen... Natürlich gibt es Gründe, dass eine Funktion globale Werte ändert.
In BlitzMAX gibt es dafür den Zusatz ByVal oder VAR, oder? Korrigiert mich, wenn dies falsch ist. Von VB kenn ich das so. z.b. Code: [AUSKLAPPEN] GLOBAL Zustand$="Saukälte"
WandleUmlaut Zustand Function WandleUmlaut( VAR Wort$) da=Instr(Wort,"ä") Wort=Left( Wort,da-1) + "ae" + mid(Wort,da+1) end function natürlich ginge das in diesem Fall mit nur 1 zu übergebenden Parameter auch eleganter: Code: [AUSKLAPPEN] GLOBAL Zustand$="Saukälte"
Zustand=WandleUmlaut(Zustand) Function WandleUmlaut$( Wort$) da=Instr(Wort,"ä") Wort=Left( Wort,da-1) + "ae" + mid(Wort,da+1) Return Wort end function aber wenn mehr als 1 Parameter zurückgegeben werden verwende ich die VAR-Möglichkeit öfters. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nunja, das ist ja schliesslich der Sinn von globalen Variablen. Aber man sollte den Programmcode nicht von grundauf so aufbauen, dass dann alles global deklariert wird, nur um die Werte dann überall ändern zu können. Hab ich auch so erwähnt... In so einem Fall kann man dann auch gleich auf Gosub ausweichen, welche auch minimalistisch schneller sind. Und da der Fragesteller grad mit Funktionen anfängt, wollte ich eben genau dieses Problem ansprechen. Denn einmal angewöhnte Programmierstile lassen sich dann nur schwer wieder abgewöhnen. | ||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich bin nicht erst am Anfang mit den Funktionen, sondern habe schon viel damit gemacht. Allerdings seh ich grad den Wald vor lauter Bäumen nicht und genau deswegen fragte ich.
Ich weiß das ich Gosub verwenden könnte, aber ich wollte das eigentlich mit Funktionen machen. Wenn man eine Variable übergeben will, kann man das ja mit Return machen, aber wie geht das wenn man mehrere hat und Types nicht verwenden kann oder will ? |
||
![]() ![]() |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
[Edit #1: alles gelöscht... war Blödsinn...]
ich glaub ich habs gefunden: ..... ![]() |
||
- Zuletzt bearbeitet von Midimaster am Do, Dez 17, 2009 14:49, insgesamt einmal bearbeitet
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab Blitz3D und da funktioniert das nicht. | ||
![]() ![]() |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
geht natürlich nicht, schade...schei...
Aber das ist Dir schon zu umständlich, oder? Code: [AUSKLAPPEN] Type MyIntegerTyp
Field Wert% End Type Type MyStringTyp Field Wert$ End Type Global A.MyIntegerTyp=New MyIntegerTyp Global B.MyStringTyp=New MyStringTyp A\Wert=10 B\Wert="Hund" Wandle A,b Print a\Wert Print b\Wert WaitKey() Function Wandle(A.MyIntegerTyp, B.MyStringTyp) A\Wert=A\Wert+22 B\Wert=B\Wert+"ekälte" End Function |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das liegt daran, dass du der Funktion Parameter übergibst, die genau gleich heissen wie die globalen Variablen. Explizit lokal definierte Variablen (per Local![]() Da du in deinem Programm Va und Vb sowieso als global deklariert hast, brauchst du ja gar keine Parameter. Daher würde ich es so machen BlitzBasic: [AUSKLAPPEN] Global Va,Vb |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du möchtest mehrere Werte aus einer Funktion zurück erhalten?
Am leichtesten ist es Globale Variablen zu verwenden. Wenn die Werte unabhängig von einander sind, lassen sich auch 2 Funktionen verwenden. ...du könntest ein Blitzarray verwenden , um die Werte darin zu speichern. Was dein Testprogramm angeht: Du überschreibst die Globalen Va und Vb wenn du sie in der Funktions-Deklaration genau so nennst, womit alles was du da machst ganz egal ist... |
||
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) |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Noobody
Ja, aber ich denke mal er will die Funktion bestimmt für mehrer verschiedene Variable nutzen.... Test(a,b) Test(c,d) vielleicht wäre ja so eine Art Zwischenspeicher die Lösung: Code: [AUSKLAPPEN] Global A%,B%
Global ZwischenSpeicherString$, ZwischenSpeicherInt% GLOBAL Zustand$="Saukälte" GLOBAL Hubert$="Erfroren" A=4 B=5 Wandle Zustand , A Zustand=ZwischenSpeicherString A=ZwischenspeicherInt Wandle Hubert,B Hubert=ZwischenSpeicherString B=ZwischenspeicherInt Print A Print B Print Zustand print Hubert Function Wandle(Wort$,Zahl%) ZwischenSpeicherString= Wort+ " heute" ZwischenspeicherInt=Zahl +10 end function |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit diesen Zwischenspeichern wird endgültig die Datenkapselung zersaut.
Merke: Wenn Du Daten nicht-global behandeln kannst, tu es. Du senkst damit massiv die Fehleranfälligkeit deiner Programe. Wenn Du mehrere Daten zurückzugeben hast, erstelle entweder einen Type mit passenden Feldern für die Rückgabe oder pack alle Parameter in einen String, getrennt durch einen Separator. Eine kleine Hilfsfunktion kann dir dann den passenden Wert rausschneiden. Bsp: "123|0.1|1.2" - hier ist | der Separator. Wenn Du Dir nun eine kleine Func schreibst die den String passend zerlegt ist es kein Problem sowas zu machen: Code: [AUSKLAPPEN] erg$=foo(bar,blub,lol)
humpa = GetParam(erg,1) taetarae= GetParam(erg,2) |
||
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 |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Midimaster
Types kann ich leider für meinen Zweck nicht verwenden, sonst hätte ich das schon lange gemacht. @Noobody So kann ich es leider auch nicht machen, da ich, wie Midimaster schon schrieb, die Funktion universell einsetzen möchte. @Xeres Wieso überschreibe ich die Variablen ? Die Varablen 'VariableA' und 'VariableB' werden der Funktion ja übergeben. Am Anfang sind diese beide 0. Innerhalb dieser Funktion werden diese Variablen Va und Vb genannt und erhöht. Da Va und Vb vorher als global deklariert wurden müssten sie ja eigentlich außerhalb der Funktion verfügbar sein. 'VariableA' bzw. '-B' übernimmt dann diese Werte und somit müsste nach dem ersten Aufruf 'VariableA'=1 und 'VariableB'=2 sein. Und diese Werte werden dann der Funktion beim nächsten Durchlauf wieder übergeben. Nach meinem logischen Verständnis müsste das funktionieren, aber das tuts ja leider nicht. |
||
![]() ![]() |
- Zuletzt bearbeitet von Bura.Tino am Do, Dez 17, 2009 15:19, insgesamt einmal bearbeitet
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weshalb scheiden Types denn aus, bura.tino? | ||
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 |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bura.Tino hat Folgendes geschrieben: Wieso überschreibe ich die Variablen ?
Das erklärte ich in meinem Post weiter oben ![]() Bura.Tino hat Folgendes geschrieben: So kann ich es leider auch nicht machen, da ich, wie Midimaster schon schrieb, die Funktion universell einsetzen möchte.
Ah, nun verstehe ich. Wenn du es so wie bisher machen willst, würde ich folgendes vorschlagen BlitzBasic: [AUSKLAPPEN] Global Va,Vb Ist ein wenig umständlich; persönlich würde ich dafür ja, wie bereits vorgeschlagen, Types oder Blitzarrays verwenden. Aber wenn du das vorziehst, warum nicht? |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Innerhalb dieser Funktion werden diese Variablen Va und Vb genannt und erhöht. Wie auch Noobody schon schrieb, ist gerade das das Problem. Wenn du die Übergabe-Variablen in der Funktion genauso nennst wie die Globalen, sind die Globalen in der Funktion nicht vorhanden!
Vergleiche: Code: [AUSKLAPPEN] Function Test(a,b) Va=a+1 Vb=b+2 End Function Edit Ach, ich werde alt... und lahm... |
||
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) |
- Zuletzt bearbeitet von Xeres am Do, Dez 17, 2009 15:24, insgesamt einmal bearbeitet
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Generell würden sie nicht unbedingt ausscheiden, aber ich wollte das eigentlich vermeiden.
Gehen wir mal von einem ganz einfachen Beispiel aus: Wir haben einen Punkt mit zwei Koordinaten(x;y). Nun will man diesen Punkt auf dem Bildschirm bewegen und übergibt der Funktion einfach nur den Wert der Veränderung für x und y. Types wären hier zuviel, denke ich. Deswegen suche ich eine bessere Möglichkeit und es verwundert mich das es nicht so einfach gehen soll, wie ich mir das vorstelle. [Edit] Wieso sind sie innerhalb der Funktion nicht vorhanden ? Sie sind doch global ! ![]() |
||
![]() ![]() |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Normalerweise bestehen alle Objekte im Spiel immer aus mehr als nur einem Koordinatenpaar... so dass es sich anbietet, gleich einen Type dafür zu erstellen... | ||
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) |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also wenn ich es so mache wie Xeres es vorgeschlagen hat, dann funktioniert es.
Code: [AUSKLAPPEN] Function Test(a,b)
Va=a+1 Vb=b+2 End Function Das Problem ist somit gelöst. Dennoch würde ich gerne verstehen wieso die Variablen überschrieben werden !? |
||
![]() ![]() |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Weil du sie in der Parameter-Zeile neu deklariest. Und diese Deklaration hat innerhalb der Funktion Vorang. Stell' dich bitte nich so an und lies, was dir die Leute schreiben. | ||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group