Wie funkioniert das mit den Funktionen ?

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

Bura.Tino

Betreff: Wie funkioniert das mit den Funktionen ?

BeitragDo, Dez 17, 2009 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 17, 2009 13:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ausweichen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Midimaster

BeitragDo, Dez 17, 2009 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Dez 17, 2009 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 17, 2009 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

Midimaster

BeitragDo, Dez 17, 2009 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
[Edit #1: alles gelöscht... war Blödsinn...]

ich glaub ich habs gefunden:
..... Crying or Very sad
  • Zuletzt bearbeitet von Midimaster am Do, Dez 17, 2009 14:49, insgesamt einmal bearbeitet

Bura.Tino

BeitragDo, Dez 17, 2009 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab Blitz3D und da funktioniert das nicht.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

Midimaster

BeitragDo, Dez 17, 2009 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 17, 2009 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Das liegt daran, dass du der Funktion Parameter übergibst, die genau gleich heissen wie die globalen Variablen. Explizit lokal definierte Variablen (per Local definiert oder als Parameter angegeben) überschreiben globale Variablen in der Funktion selbst. Das heisst, in deiner Funktion werden Va und Vb als Parameter angenommen und um 1 erhöht; am Ende der Funktion stehen sie auf 1. Da sie aber als Parameter angegeben wurden, werden nur die Parameter auf dem Stack verändert, nicht aber die globalen Variablen.

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

While Not KeyHit( 1 )
Cls

Test()
VariableA = Va
VariableB = Vb

Text 0, 0, "VariableA = " + VariableA
Text 0, 20, "VariableB = " + VariableB

Flip
Wend
End

Function Test()
Va=Va+1
Vb=Vb+2
End Function
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

Xeres

Moderator

BeitragDo, Dez 17, 2009 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Midimaster

BeitragDo, Dez 17, 2009 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BladeRunner

Moderator

BeitragDo, Dez 17, 2009 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 17, 2009 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@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.
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
  • Zuletzt bearbeitet von Bura.Tino am Do, Dez 17, 2009 15:19, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragDo, Dez 17, 2009 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 17, 2009 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Bura.Tino hat Folgendes geschrieben:
Wieso überschreibe ich die Variablen ?

Das erklärte ich in meinem Post weiter oben Wink

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

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( A, B)
Va = A + 1
Vb = B + 2
End Function

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

Xeres

Moderator

BeitragDo, Dez 17, 2009 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE 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

BeitragDo, Dez 17, 2009 15:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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 ! Surprised
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

Xeres

Moderator

BeitragDo, Dez 17, 2009 15:25
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Bura.Tino

BeitragDo, Dez 17, 2009 15:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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 !?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy

D2006

Administrator

BeitragDo, Dez 17, 2009 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group