Funktionen "funktionieren" nicht untereinander!

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

 

Matthias

BeitragDi, Dez 23, 2014 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo.

Du erzeugst ja auch immer wieder einen neuen Zufallswert.
Vlt hilft dir dieser Code weiter.

Code: [AUSKLAPPEN]

Graphics 800,600,32,2
PrgTimer=CreateTimer(60)
Local Msg$

SetBuffer BackBuffer()
Repeat
   If KeyHit(57) Then Msg=f_Msg(f_Rand()) ;Leertaste drücken
   f_Draw(Msg)
   Flip(0) WaitTimer(PrgTimer)
Until KeyHit(1)=1:End ;Escape

 
Function f_Draw(Msg$)
  Cls
  Color 255,255,255
  Text 10,10,Msg
End Function 

Function f_Rand()
   Return Rand(0,10)
End Function

Function f_Msg$(RandNumber)
   Select RandNumber
      Case 1 Return "Hallo"
      Case 2 Return "Tschüß"
      Case 3 Return "Hund"
      Default Return "Nö"
   End Select
End Function


 

PhillipK

BeitragDi, Dez 23, 2014 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also rein vom Code sieht es so aus, als würde die Zufallszahl sich pro Programmstart einmal ändern.
Sollte sich die "Zufallszahl" pro schleifendruchlauf ändern - Was zum.. ?

Das sie sich ständig ändert hängt vom 'Seed' ab (aus diesem werden die zufallszahlen errechnet. Gleicher seed, gleiche zufallszahl quasie.)
Ob 'Global SeedRnd MilliSecs()' in der form funktioniert weiß ich grade nicht so recht. Evtl solltest du das Global da weglassen *grübel* aber da du immer neue zufallszahlen hast, sollte es also klappen. Setz den wert mal fix auf 0, dann solltest du immer die selbe zufallszahl kriegen.

Warum?
Die zufallszahl ändert sich solange RndZahl_counter <= 1 ist (ist RndZahl_counter 0, wird sie erhöht auf 1. Danach wird eine zufällige Zahl geholt, welche vom Seed abgeleitet wird - also fixer seed, fixe zufallszahl. Danach wird nurnoch die Zufallszahl zurückgegeben)

ACHTUNG!
Function f_Hello()
-> dort rufst du f_RndZahl() auf.
Ist RndZahl_counter > 1 (also nach dem 2ten aufruf) dann ruft die funktion wiederrum f_Hello() auf.

Spiel das ganze mal durch Wink f_Hello ruft f_RndZahl auf, welches f_Hello aufruft, welches wiederrum f_RndZahl aufruft... das Programm sollte nach wenigen sekunden abstürzen, weil sich in der Zeit zigtausend funktionsaufrufe tätigen, welche niemals aufhören.
Stürtz es nicht ab - cool, BlitzBasic spielt da (ganz übel) rein.
So oder so, das solltest du auf jedenfall vermeiden.
(Stichwort: Rekursion; Endlos)


Weiterer Hinweis:
Global timer= CreateTimer(1000)

Timer sind normalerweise auf Hertz basis. Stellst du hier 60 ein, kannst du das Programm mit 60 Frames bzw Updates pro sekunde laufen lassen. Vorraussetzung hierfür ist allerdings auch, das du WaitTimer nutzen musst.
Du hast zwar Delay (3) drin, aber da solltest du direkt die finger von lassen, ausser du hast einen guten grund, Delay zu verwenden.
Delay wartet X millisekunden und fährt dann mit dem Programm fort. WaitTimer hingegen wartet auf den nächsten timer-tick (also zb 60 stück davon pro sekunde) und gibt derweil die kontrolle an das Betriebssystem zurück -> CPU schonend.
 

170leo170

BeitragDi, Dez 23, 2014 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die ganzen Antworten! Der Code ist wirklich gut, es ist nur so dass ich den gerne so gut wie es alleine schreiben möchte. Trotzdem danke, ich werde mal schauen ob ich mache übernehmen kann Smile

Und zu PhillipK, was meintest du mit "Setz den wert mal fix auf 0, dann solltest du immer die selbe zufallszahl kriegen"?

Und könnte ich evt. die Funktion so umschreiben, dass sie, nachdem ein Zufallswert erstellt wurde, selbst schließt? Bspw in der Weise:


Function f_RndZahl()

Repeat
RndZahl_counter = RndZahl_counter + 1

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


Return Rnd_Zahl%

Until RndZahl_counter = 1

If RndZahl_counter > 1 Then End Function
 

PhillipK

BeitragDi, Dez 23, 2014 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh entschuldige, ich hätte das ganze etwas weiter ausführen sollen.

BlitzBasic: [AUSKLAPPEN]
Global SeedRnd MilliSecs()


hier erstellst du die Globale "SeedRnd" (sollte zumindest so sein). Das ist schonmal eventuell ein fehler.
Der Hilfe zufolge ist dies eine funktion.

Also, SeedRnd( wert ).
Damit initialisierst du einen Seed für die Random funktionen.
Statt wert kannst du alles einsetzen was du magst, gängig ist allerdings Millisecs()
Millisecs liefert die Millisekunden seit dem OS start und ist somit ein recht brauchbarer ausgangswert für zufallszahlen.
trag hier zum testen andere werte, wie zb 0, ein.

Zu deinem weiteren problem, du könntest eine Globale "RndZahl" erstellen und anfangs auf 0 setzen.

Danach:
BlitzBasic: [AUSKLAPPEN]
Function f_RndZahl()
If ( RndZahl > 0 ) Then
Return RndZahl
EndIf

RndZahl = Rand(1,3)
End Function

oder ähnliche ansätze.

Repeat ist eine schleife, welche hier weniger sinnvoll ist. zumal deine unten aufgeführte Repeat schleife auch nur einmalig laufen würde.
End Function ist ein schlagwort, welches nicht durch eine abfrage ausgelöst werden kann - End Function muss ZWINGEND das ende der Funktion darstellen, da der Compiler den Block sonst nicht fehlerfrei zuordnen kann. Genauer gesagt würde er hier meckern, weil If ohne Endif aufgerufen wurde *grübel*
 

170leo170

BeitragDi, Dez 23, 2014 22:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank für die Funktion und die Erklärung Smile Ich bin mir jedoch immer noch unsicher was du mit SeedRnd meinst. Soll ich das Global weglassen und es direkt in/vor die Funktion schieben, weil grad ist die Zahl nicht random sondern immer die 2?

DAK

BeitragMi, Dez 24, 2014 10:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If RndZahl_counter > 1 Then End Function

Das ist noch ein grober Fehler, den der Compiler eigentlich nicht durchlassen sollte.

End Function ist das Ende eines Funktionsblocks (so wie EndIf das Ende eines If-Blocks ist), nicht ein echter Befehl. Wenn du willst, dass die Funktion an dieser Stelle beendet wird, dann verwende Return. Richtig wäre also folgendes:

BlitzBasic: [AUSKLAPPEN]
Function foo()
If (RndZahl_counter > 1) Then Return
End Function
Gewinner der 6. und der 68. BlitzCodeCompo
 

170leo170

BeitragMi, Dez 24, 2014 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Oke danke für die Erklärung Smile weis jmd vl wie ich meine rnd_number auch wirklich random bekomme und sie nicht immer die gleiche ist?

DAK

BeitragDo, Dez 25, 2014 0:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Denke, das kam schon ein paar Mal:

BlitzBasic: [AUSKLAPPEN]
SeedRnd(MilliSecs())

Ein Mal am Anfang des Programms. Nicht jeden Schleifenaufruf oder so.
Gewinner der 6. und der 68. BlitzCodeCompo
 

170leo170

BeitragDo, Dez 25, 2014 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, das Problem jz ist aber, dass sich die Rnd_Zahlen wiederholen. Wenn ich es an den Anfang stell kann ich es nicht "global" machen und die Rnd_Number ist wieder nur die 2. :/

DAK

BeitragDo, Dez 25, 2014 16:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, nix global. Global ist nur für Variablen. SeedRnd() ist ein Funktionsaufruf (erkennbar an den Klammern), der kann nicht global sein.

Bitte lies dir doch ein gutes Tutorial durch (vollständig!), wie z.B. Robs Tutorial 2.
Lies dir auch bitte den gesamten Thread für Neueinsteiger durch: [url=https://www.blitzforum.de/forum/viewtopic.php?t=6114]
Gewinner der 6. und der 68. BlitzCodeCompo

BladeRunner

Moderator

BeitragDo, Dez 25, 2014 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht nur lesen - durcharbeiten und verstehen. Ich habe den Eindruck dass es hier übelst an Grundlagen fehlt, daher sollten wir wohl viel kleiner anfangen...

Erst mal solltest Du Dir einig werden was der Unterschied zwischen Variablen und Funktionen ist und wie man eben diese verwendet.

Kleine Hausaufgabe für dich:
Schreibe ein Programm dass vom Benutzer zwei Zahlen erfragt und als Ergebnis die Summe und das Ergebnis der Multiplikation anzeigt.
Ganz ohne Funktionen, einfach straight durch.
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

Holzchopf

Meisterpacker

BeitragDo, Dez 25, 2014 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du noch mehr Hausaufgaben machen möchtest Rolling Eyes kannst du auch die Beginner's Practice Series durcharbeiten. Die steigen zwar nicht ganz am Anfang ein, aber sobald du die Grundlagen inne hast, kannst du dich gut an die wagen. Smile
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

170leo170

BeitragDo, Dez 25, 2014 23:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab zwar grad Urlaub, aber die Hausaufgaben mach ich gern, danke für den Tipp Smile
 

170leo170

BeitragFr, Dez 26, 2014 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo nochmal, das erste Programm war relativ einfach:

Code: [AUSKLAPPEN]
Input1 = Input("Deine erste Zahl: ")
Input2 = Input("Deiner zweite Zahl: ")

Ergebniss% = Input1% + Input2%
Print "Das Ergebniss " + Ergebniss%

WaitKey
End




Ich versuche gerade anhand von einem Videoguides ein Programm zu schreiben. Mein Problem ist, dass immer "Invalid Image Handle" dasteht, wieso?

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


;Array-------------------
Dim array(13,10)

Data 0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,2,2,0,0,0,0,0,0,0,0,0,0
Data 0,2,2,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,0,0,0,0,0,0,0,0,0,0,0
Data 0,0,1,1,1,1,1,1,1,1,1,1,1
Data 0,0,1,0,0,0,0,0,0,1,0,0,0
Data 0,0,1,0,0,0,0,0,0,1,0,0,0
Data 0,0,1,0,0,0,0,0,0,1,0,0,0
Data 0,0,1,0,0,0,0,0,0,1,0,0,0
Data 0,0,1,0,0,0,0,0,0,1,0,0,0


;Globals---------------------
Global tile1 = LoadImage("C:\Users\Leon\Desktop\BlitzBasic\Gras.bmp")
Global tile2 = LoadImage("C:\Users\Leon\Desktop\BlitzBasic\Weg.bmp")
Global tile3 = LoadImage("C:\Users\Leon\Desktop\BlitzBasic\Wasser.bmp")

Global readinfo = 1
 
;Draw Images--------------
While Not KeyHit (1)
 Cls

F_drawtiles()

 Flip
Wend

End


;Functions--------------
Function F_drawtiles()

For y = 1 To 10
For x = 1 To 13
 If readinfo = 1 Then Read array(x,y)    

   If array (x,y) = 0 Then
      DrawImage(tile1, x, y)
   
   ElseIf array(x,y) = 1 Then
      DrawImage(tile2, x, y)
   
   ElseIf array(x,y) = 2 Then
      DrawImage(tile3, x, y)

      
   EndIf    
   
Next
Next

End Function
 

170leo170

BeitragFr, Dez 26, 2014 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry, hab nur im falschen Format gespeichert.

DAK

BeitragFr, Dez 26, 2014 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Verwende doch bitte für sowas den Edit-Button statt einen Doppelpost zu machen.
Gewinner der 6. und der 68. BlitzCodeCompo

Chester

BeitragFr, Dez 26, 2014 20:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wobei du dir besser gleich einprägen kannst, relative Pfadangaben zu benutzen. Sonst kopierst du dein Programm irgendwann in einen anderen Ordner und wunderst dich, dass nichts mehr geht, weil die Angaben nicht mehr alle stimmen.

Und falls du mal ne neue Struktur kennen lernen willst, für den Zweck in deiner Funktion wären Select-Abfragen wie gerufen Wink

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group