Funktionen "funktionieren" nicht untereinander!

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

170leo170

Betreff: Funktionen "funktionieren" nicht untereinander!

BeitragMo, Dez 22, 2014 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich bin ein blutiger Anfänger und arbeite gerade an meinem ersten Code. Jedoch funktioniert etwas innheralb meines Codes nicht und Funktionen agieren nicht miteinander. Mein Problem ist, dass Rnd_Spruch nicht auf meinen Bildschirm erscheint. Jedoch sollte doch alles Sinn ergeben oder? Kann mir bitte jmd helfen, wäre sehr nett und Danke im Voraus für alle die Antworten Smile



BlitzBasic: [AUSKLAPPEN]
;Graphics---------------
Const screen_height= 780, screen_width = 850
Graphics screen_height, screen_width
SetBuffer BackBuffer()


;Globals--------------
Global iX = 400
Global iY = 60


;MilliSecs()


;Screen----------------
While Not KeyHit(1)

Cls


f_RndZahl
f_RndSpruch
f_Hello


Flip
Delay (1)
Wend
End


;Functions--------------

Function f_Hello()

If Rnd_Zahl = 1 Text iX,iY, Rnd_Spruch$


If iY > 381 Then iX = iX +1
If iY < 380 Then iX = iX -1

If iX > 369 Then iY = iY -1
If iX < 369 Then iY = iY +1




End Function


;-----------------------
Function f_RndZahl()



For Rnd_Zahl = 1 To 1

Delay 1000

Rand(1,1)


Next
End Function


;--------------------------
Function f_RndSpruch()


If Rnd_Zahl = 1 Rnd_Spruch$ = "Hello"
If Rnd_Zahl > 1 End


End Function

Xeres

Moderator

BeitragMo, Dez 22, 2014 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Willkommen. Bitte benutze in Zukunft selbst die Code bzw. BB Syntax boxen, danke.

- Gewöhne dir gleich an, alle Funktionen immer mit Klammern zu schreiben. Ohne Klammern werden keine Werte zurück gegeben und schlecht lesbar ist es außerdem.
- Gleiches gilt für if...then Konstrukte - das then würde ich nicht weglassen.
- Das Problem mit der Funktion des Codes ist, dass du variablen nur lokal in den Funktionen benutzt und das nichts jemals ausgegeben wird -> immer local oder global deklarieren.
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)
 

170leo170

BeitragMo, Dez 22, 2014 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die schnelle Antwort Smile Ich hab jetzt alles gemacht aber es funktioniert trotzdem nicht.

Code: [AUSKLAPPEN]

;Graphics---------------
Const screen_height= 780, screen_width = 850
Graphics screen_height, screen_width
SetBuffer BackBuffer()


;Globals--------------
Global iX = 400
Global iY = 60
Global Rnd_Spruch$ = 0
Global Rnd_Nummer = 0

;MilliSecs()


;Screen----------------
While Not KeyHit(1)

Cls


f_RndZahl()
f_RndSpruch()
f_Hello()


Flip
Delay (1) 
Wend
End


;Functions--------------

Function f_RndZahl()


   For Rnd_Zahl = 1 To 1

   Delay 1000

   Rand(1,1)
   

Next
End Function


;--------------------------
Function f_RndSpruch()


   If Rnd_Zahl = 1 Then Rnd_Spruch$ = Rnd_Spruch$ + 1
   
   
 
End Function


;-----------------------
Function f_Hello()

 If Rnd_Spruch$ = 1 Then Text iX,iY, Rnd_Spruch$

   If iY > 381 Then iX = iX +1
   If iY < 380 Then iX = iX -1

   If iX > 369 Then iY = iY -1
   If iX < 369 Then iY = iY +1
   
   


End Function

BladeRunner

Moderator

BeitragMo, Dez 22, 2014 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke Du hast Xeres Antwort nicht in gänze verstanden.
Damit man von einer Funktion was entgegennehmen kann muss sie was zurückgeben - mit Return.
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
 

170leo170

BeitragMo, Dez 22, 2014 22:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok danke und wie würde "Return" dann konkret an meinen Code aussehen?

SpionAtom

BeitragMo, Dez 22, 2014 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo du,
ich finde es erstmal gut, dass du verschiedene Funktionen für verschiedene Aufgaben verwendest. f_hello ist wohl zum Anzeigen eines Textes, f_RndSpruch ist eine Datenfunktion.
Deine Function f_RndZahl() gibt mir momentan noch Rätsel auf. Was soll die bewerkstelligen?

Wenn du möchtest, dass die Variable RndZahl am Ende der Funktion einen neuen Zufalls erhält, dann reicht diese Zeile
Code: [AUSKLAPPEN]

RndZahl = Rand(1, 1)


Wenn du möchtest, dass sich der Wert nur pro Sekunde einmal ändert, dann musst du mit millisecs arbeiten.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

170leo170

BeitragMo, Dez 22, 2014 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@Spion Atom, das Rnd_Zahl ist für spätere Zwecke und für meine jetzige Frage eigentlich irrelevant, ich habe das nur ausersehen mitkopiert.
Ich will zuerst erreichen, das Rnd_Spruch angezeigt wird, später will ich mehrere Sprüche haben die dann je nach Rnd_Number angezeigt werden. Wenn Bspw. die Zahl 1 "gewürfelt" wird kommt hallo, bei Zahl 2 dann z.B. "tschüss" etc Smile

BladeRunner

Moderator

BeitragMo, Dez 22, 2014 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
170leo170 hat Folgendes geschrieben:
Ok danke und wie würde "Return" dann konkret an meinen Code aussehen?

Liess dir die Beschreibung zu Return durch in der Verlinkung und überlege Dir welchen Wert welche Funktion zurückgeben muss damit die aufrufende Instanz die Daten hat die sie benötigt.

Ein einfaches und sehr sinnloses beispiel:
BlitzBasic: [AUSKLAPPEN]
hello()


Function Hello()
Print "Hello "+world()
End Function

Function World$()
Local welt$ = "world"
Return welt
End Function
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

SpionAtom

Betreff: Arrays

BeitragMo, Dez 22, 2014 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier noch ein Beispiel mit einer etwas anderen Struktur (Eingabe, Verarbeitung, Ausgabe) und Arrays, die dafür geeignet sind, Werte (wie deine Texte) Zahlen zuzuordnen.
In diesem Programm muss man die Zifferntasten zwischen 1 und 6 drücken, damit sich der Text ändert.
Noch ein Code-Tipp: Immer schön Kommentare setzen, damit andere und du selber hinterher noch wissen, was abgeht Cool

Code: [AUSKLAPPEN]
Graphics 640, 480, 0, 2
SetBuffer BackBuffer()


   ;save messages in a BlitzArray
   Const messages_count = 6
   Global messages$[messages_count]
   messages[1] = "Guten Tag"
   messages[2] = "Hallo"
   messages[3] = "Hola"
   messages[4] = "Grüße"
   messages[5] = "Tach allerseits"
   messages[6] = "Anwesend"
   
   Global message$ = messages[1]

   Repeat
   ;Eingabe
      ;check if key [1]..[messages_count] is pressed
      key = GetKey()
      If key >= 49 And key < 49 + messages_count Then
         key_pressed = key - 48
      Else
         key_pressed = 0
      End If
      
   ;Verarbeitung
      updateMessage(key_pressed)
      
   ;Ausgabe
      Cls
      showMessage   
      Flip()
   
   Until KeyDown(1)
   End
   

;shows message$ in the center of the screen   and draws a border line
Function showMessage()

   x = (GraphicsWidth() - StringWidth(message$)) / 2
   y = (GraphicsHeight() - StringHeight(message$)) / 2
   Text x, y, message$
   
   border = 5
   Rect x - border, y - border, StringWidth(message$) + 2 * border, StringHeight(message$) + 2 * border, 0
   
End Function

;changes the message according to the number parameter
Function updateMessage(number)

   If number = 0 Then Return
   message$ = messages[number]
      
End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

170leo170

BeitragMo, Dez 22, 2014 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab ne Ewigkeit herumprobiert, aber ich kriegs einfach nicht hin :/ Ich weiß es ist besser wenn ich das selbst herausfinde, aber könntet ihr mir bitte die Lösung verraten?

BladeRunner

Moderator

BeitragMo, Dez 22, 2014 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Zeig uns doch einfach was Du weiter ausprobiert hast. Smile
Vielleicht können wir dazu weitere Tipps geben.
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
 

170leo170

BeitragMo, Dez 22, 2014 23:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok also ich hab 2 Sachen ausprobiert:

1. Wie benutzt man Return in Verbindung mit Zufälligen Zahlen

Code: [AUSKLAPPEN]
;Seed Random Millisecs
SeedRnd MilliSecs()



;Function um x zu zeichen
Function Draw_Number()

   Print x

End Function



;Funktion um aus x -> 5 verschiedene zufällige Nummern mit den Werten 1-10 zu machen
Function Random_Number()

   For x = 1 To 5 Rand(1,10)
   Return x
   Next   

End Function






2. Wie man Return in den verdammten Code reinbekommt >Sad


Code: [AUSKLAPPEN]

;Graphics---------------
Const screen_height= 780, screen_width = 850
Graphics screen_height, screen_width
SetBuffer BackBuffer()


;Globals--------------
Global iX = 400
Global iY = 60

Global SeedRnd MilliSecs()


;Screen----------------
While Not KeyHit(1)

Cls


f_RndZahl()
f_RndSpruch()
f_Hello()


Flip
Delay (1) 
Wend
End


;Functions--------------
;1. Funktion um eine (bisher noch nicht) zufällige Zahl zu erstellen

Function f_RndZahl()

   For Rnd_Zahl = 1 To 1

   Delay 1000

   Rand(1,1)
   
   Return Rnd_Zahl

Next
End Function


;---------------------------------------------
;2. Funktion um jeder Zahl einen Spruch zuzuweisen
Function f_RndSpruch()


   If Rnd_Zahl = 1 Then Rnd_Spruch$ = "Hallo"
   
   Return Rnd_Spruch$
   
 
End Function


;--------------------------------------------
;3. Funktion um den Spruch zu zeichnen
Function f_Hello()

   If Rnd_Zahl = 1 Then Text iX,iY, Rnd_Spruch$
   

   If iY > 381 Then iX = iX +1
   If iY < 380 Then iX = iX -1

   If iX > 369 Then iY = iY -1
   If iX < 369 Then iY = iY +1
   
   

End Function






Und bei beiden habe ich Probleme :/ Danke übrigens nochmal, dass ihr euch die Zeit nehmt, um so einem Leien zu helfen Smile

BladeRunner

Moderator

BeitragDi, Dez 23, 2014 0:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, zurück ans Reissbrett. Vielleicht solltest Du erst mal das Konzept der Variablen verstehen.
In iener Variablen speicherst Du einen Wert. Das kann zB eine Zahl oder eine Zeichenkette sein.
Je nachdem was darin gespeichert wird hat die Variable einen Typ.

Wenn Du nun mit Variablen arbeiten willst musst Du ihnen Werte zuweisen. Hier hapert es in deinem Code.

Deine Function Draw_number() erhält keine Variable als Parameter. Sie kann x nur printen wenn x global ist.

Würdest Du stattdessen Function Drawnumber(x:int) machen, kann das x eine beliebige lokale Variable oder Zahl sein.
Dann würde die Funktion zB so aufgerufen: Drawnumber(5) oder auch DrawNumber(3*a+5)

Deine Function Random_number() ergibt so keinen Sinnm, es wird nicht aus x 5 zufällige Werte gemacht sondern hier ist x ein Schleifenzähler, also eine Variable die solange weitergezählt wird bis der Zielwert erreicht ist.
Dein Randbefehl ist belanglos, weil er keiner Variable zugewiesen wird. (Die Zuweisung geht wie im Matheunterricht mit = )
Zudem benutzt du Return in der Schleife, und damit bricht die ab, da die Funktion verlassen wird. Eine Funktion kann normalerweise nur einen Wert zurückgeben.

Ich kann Dir nur raten mit kleinsten Beispielen anzufangen und dir die Beschriebungen zu den verwendeten Befehlen hier in der Hilfe genau durchzulesen. Da sind dann auch weitere Beispiele dabei.
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

Xeres

Moderator

BeitragDi, Dez 23, 2014 0:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Was exakt sollte denn passieren, wenn die Funktion einen String zurück gibt, dieser aber nicht mit Text oder Print ausgegeben wird? Wink

BlitzBasic: [AUSKLAPPEN]


f_RndSpruch()

Function f_RndSpruch()

Rnd_Spruch$ = "Hallo"
Return Rnd_Spruch$

End Function

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)

BladeRunner

Moderator

BeitragDi, Dez 23, 2014 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Funktion gibt ja nicht mal einen String zurück, da sie eine Zalh als Rückgabewert hat. Darauf wurdest Du auch schon hingewiesen.
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
 

170leo170

BeitragDi, Dez 23, 2014 0:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Haha ich fühl mich so dumm Very Happy naja okay ich arbeite morgen weiter dran, hoffentlich klappt's dann.
 

170leo170

BeitragDi, Dez 23, 2014 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres ich glaube ich hab Return falsch verstanden. Ich dachte es dient als eine Art "Globalisierung" einer Variablen in einer Funktion, sodass man die Variable auch im späteren Verlauf des Codes verwenden kann. Ich wollte Rnd_spruch in der Funktion durch Return "Globalisierung" sodass ich Rnd_spruch wieder in der 3. Funktion benutzen. Gibt es überhaupt einen Befehl der meiner falschen Vorstellungen von Return ähnlich kommt?

DAK

BeitragDi, Dez 23, 2014 1:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, mal als erstes was Return macht: Return beendet die Ausführung der Funktion an dieser Stelle, und gibt den Wert nach außen zurück:


BlitzBasic: [AUSKLAPPEN]
Function foo(x)
Return x*2
End Function

y = foo(10) ;y wird jetzt der Wert zugewiesen, den foo(10) ausgibt, also 20


Rückgabewerte funktionieren nur dann, wenn die Funktion mit Klammern aufgerufen wird:

BlitzBasic: [AUSKLAPPEN]
y = bar() ;y enthält jetzt den Wert der von bar() zurück gegeben wird

y = bar ;bar wird als Variable interpretiert (wegen den fehlenden Klammern).
;Da bar noch nicht verwendet wurde ist y=0

bar ;Die Funktion bar wird aufgerufen, es gibt aber keinen Rückgabewert



Um so einen Wert in einer anderen Funktion wiederzuverwenden mach sowas:

BlitzBasic: [AUSKLAPPEN]
Function foo()
randomNumber = Rand(1,6)
Return randomNumber
End Function

Function bar(x)
Print("Deine Zahl: "+x)
End Function

x = foo()
bar(x)


Oder gleich

BlitzBasic: [AUSKLAPPEN]
bar(foo())
Gewinner der 6. und der 68. BlitzCodeCompo

BladeRunner

Moderator

BeitragDi, Dez 23, 2014 10:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast Du Dir die Beispiele in der Hilfe mal angesehen? Oder die Beispiele die wir Dir hier gegeben haben?
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
 

170leo170

BeitragDi, Dez 23, 2014 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mir alle Antworten gründlich durchgelesen und auch Beispiele dazu gemacht. Es ist nur viel auf einmal. Ich habe jz. eine Lösung gefunden wie ich mit Return die Werte "speicher". Ebenfalls habe ich die 2. Funktion zu welche Nummer welchem Spruch angehört an die 3. Funktion (f_Hello) gehängt. Das Problem nun ist jedoch, dass meine Rnd_Number sich jedes Mal ändert. Ich habe versucht das zu umgehen, jedoch stürtz BlitzBasic dann ab :/


Code: [AUSKLAPPEN]

;Graphics---------------
Const screen_height= 780, screen_width = 850
Graphics screen_height, screen_width
SetBuffer BackBuffer()


;Globals--------------
Global iX    = 400
Global iY    = 60

Global timer= CreateTimer(1000)

Global RndZahl_counter = 0

Global a    = f_RndZahl()
Global b   = f_Hello()

Global SeedRnd MilliSecs()

;Screen----------------
While Not KeyHit(1)

Cls



f_Hello()


Flip
Delay (3) 
Wend
End


;Functions--------------
;1. Funktion um eine (bisher noch nicht) zufällige Zahl zu erstellen

Function f_RndZahl()

   RndZahl_counter = RndZahl_counter + 1
   
   If RndZahl_counter = 1 Then Rnd_Zahl% =  Rand(1,3)
   If RndZahl_counter > 1 Then f_Hello()

   Return Rnd_Zahl%

End Function

 

;--------------------------------------------
;2. Funktion um den Spruch zu zeichnen
Function f_Hello()
    
   If f_RndZahl() = 1 Then Text iX, iY,   "Hallo"

    If f_RndZahl() = 2 Then Text iX, iY,   "Tschüss"

   If f_RndZahl() = 3 Then Text iX, iY,   "Auf Wiedersehen"
   


   If iY > 381 Then iX = iX +1
   If iY < 380 Then iX = iX -1

   If iX > 369 Then iY = iY -1
   If iX < 369 Then iY = iY +1
   
   


End Function

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group