Funktionen "funktionieren" nicht untereinander!
Übersicht BlitzBasic Beginners-Corner
170leo170Betreff: Funktionen "funktionieren" nicht untereinander! |
Mo, Dez 22, 2014 21:49 Antworten mit Zitat |
|
---|---|---|
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
BlitzBasic: [AUSKLAPPEN] ;Graphics--------------- |
||
XeresModerator |
Mo, Dez 22, 2014 22:00 Antworten mit Zitat |
|
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
170leo170 |
Mo, Dez 22, 2014 22:12 Antworten mit Zitat |
|
---|---|---|
Vielen Dank für die schnelle Antwort 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 |
||
BladeRunnerModerator |
Mo, Dez 22, 2014 22:18 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Dez 22, 2014 22:24 Antworten mit Zitat |
|
---|---|---|
Ok danke und wie würde "Return" dann konkret an meinen Code aussehen? | ||
SpionAtom |
Mo, Dez 22, 2014 22:25 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Dez 22, 2014 22:30 Antworten mit Zitat |
|
---|---|---|
@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 |
||
BladeRunnerModerator |
Mo, Dez 22, 2014 22:37 Antworten mit Zitat |
|
---|---|---|
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() |
||
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 |
SpionAtomBetreff: Arrays |
Mo, Dez 22, 2014 22:54 Antworten mit Zitat |
|
---|---|---|
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 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 |
Mo, Dez 22, 2014 23:25 Antworten mit Zitat |
|
---|---|---|
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? | ||
BladeRunnerModerator |
Mo, Dez 22, 2014 23:28 Antworten mit Zitat |
|
---|---|---|
Zeig uns doch einfach was Du weiter ausprobiert hast.
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 |
Mo, Dez 22, 2014 23:50 Antworten mit Zitat |
|
---|---|---|
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 > 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 |
||
BladeRunnerModerator |
Di, Dez 23, 2014 0:01 Antworten mit Zitat |
|
---|---|---|
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 |
XeresModerator |
Di, Dez 23, 2014 0:03 Antworten mit Zitat |
|
---|---|---|
Was exakt sollte denn passieren, wenn die Funktion einen String zurück gibt, dieser aber nicht mit Text oder Print ausgegeben wird?
BlitzBasic: [AUSKLAPPEN]
|
||
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) |
BladeRunnerModerator |
Di, Dez 23, 2014 0:05 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Dez 23, 2014 0:21 Antworten mit Zitat |
|
---|---|---|
Haha ich fühl mich so dumm naja okay ich arbeite morgen weiter dran, hoffentlich klappt's dann. | ||
170leo170 |
Di, Dez 23, 2014 0:29 Antworten mit Zitat |
|
---|---|---|
@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 |
Di, Dez 23, 2014 1:24 Antworten mit Zitat |
|
---|---|---|
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) 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 Um so einen Wert in einer anderen Funktion wiederzuverwenden mach sowas: BlitzBasic: [AUSKLAPPEN] Function foo() Oder gleich BlitzBasic: [AUSKLAPPEN] bar(foo()) |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
BladeRunnerModerator |
Di, Dez 23, 2014 10:35 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Dez 23, 2014 16:58 Antworten mit Zitat |
|
---|---|---|
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 |
||
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group