Programmier Fehler?

Übersicht BlitzBasic BlitzPlus

Neue Antwort erstellen

TBP1

Betreff: Programmier Fehler?

BeitragMo, Nov 15, 2004 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Ich hab letztens einfach mal zum Spaß ein kleines Programm geschrieben,
welches einen verschiedene Bilder zeigt und anhand der Bewertung des
Anwenders ein Ergebnis zieht. Die einzelnen Abfragen sehen ungefähr so aus:
Code: [AUSKLAPPEN]

.anfang1
Cls
Text 0, 0, "Thema : Thema1"
Flip
Repeat
If KeyDown(36) = 1 Then Goto haupt1
If KeyDown(49) = 1
D1 = 4
Goto anfang2
EndIf
If KeyDown(1) = 1 Then Goto ende
Forever

.haupt1
bild = LoadImage("bilder/bild1.jpg")
Cls
DrawImage bild, 0, 0
Text 0, 700, "Bewerte: 1=gut, 2=geht, 3=nich mein fall"
Flip
Repeat
If KeyDown(79) = 1 Or KeyDown(2) = 1
D1=1
Goto anfang2
EndIf
If KeyDown(80) = 1 Or KeyDown(3) = 1
D1=2
Goto anfang2
EndIf
If KeyDown(81) = 1 Or KeyDown(4) = 1
D1=3
Goto anfang2
EndIf
Forever

Die spätere Auswertung sieht so aus:
Code: [AUSKLAPPEN]

.ende
Cls
Text 0, 0, "männlein oder weiblein(m oder w)?"
Flip
Repeat
If KeyDown(50) = 1 Then
geschlecht = 1
Goto auswertung
EndIf
If KeyDown(17) = 1 Then
geschlecht = 2
Goto auswertung
EndIf
Forever
.auswertung
; Dies ist einfach eine Besonderheit für Frage 11 und 12
If D13=1 Or D14=1 Then
 If geschlecht = 1
 ergebnis = "Ergebnis 4 män."
 EndIf
 If geschlecht = 2
 ergebnis = "Ergebnis 4 wei."
 EndIf
Goto auswertung2
EndIf
;Ab hier gehts erst richtig los
Derg = D1 + D2 + D3 + D4 + D5 + D6 + D7 + D8 + D9 + D10 + D11 + D12 + D13 + D14
If Derg>39 And geschlecht = 1
ergebnis = "Ergebnis 1 män."
Goto auswertung2
EndIf
If Derg>39 And geschlecht = 2
ergebnis = "Ergebnis 2 wei."
Goto auswertung2
EndIf   
If Derg=30 Or Derg=31 Or Derg=32 Or Derg=33 Or Derg=34 Or Derg=35 Or Derg=36 Or Derg=37 Or Derg=38 Or Derg=39
 If geschlecht = 1
 ergebnis = "Ergebnis 2 män."
 EndIf
 If geschlecht = 2
 ergebnis = "Ergebnis 2 wei."
 EndIf 
Goto auswertung2
EndIf
If Derg=20 Or derg=21 Or Derg=22 Or Derg=23 Or Derg=24 Or derg=25 Or derg=26 Or derg=27 Or derg=28 Or derg=29
 If geschlecht = 1
 ergebnis = "Ergebnis 3 män."
 EndIf
 If geschlecht = 2
 ergebnis = "Ergebnis 3 wei."
 EndIf
Goto auswertung2
EndIf
If Derg<21
 If geschlecht = 1
 ergebnis = "Ergebnis 4 män."
 EndIf
 If geschlecht = 2
 ergebnis = "Ergebnis 4 wei."
 EndIf
Goto auswertung2
EndIf

.auswertung2
Cls
font3 = LoadFont("Courier",30, 0, 0, 0)
Text 0, 0, "Der Test hat ergeben, dass du ein/e"
SetFont font3
Text 50, 50, ergebnis
SetFont font2
Text 0, 100, "bist."
Flip
Delay 5000
End

So, jetzt schreibt er mir aber immer als ergebnis 0. Ich weiß nicht, woran es liegt. Die Eingaben des Anwenders bei den Bildern nimmt er an, Derg(ebnis) stimmt auch(leider nicht immer), aber die variable "ergebnis" ist immer 0. Was hab ich bloß falsch gemacht?

DA

BeitragMo, Nov 15, 2004 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Darf ich dir raten nicht mehr dieses beschissene Goto zu benutzen?
Ich denke nicht nur ich sondern auch andere Forum mitglieder gucken deinen Code nicht nach schon alleine wegen dem Goto.
Einmal oder zweimal geht ja noch, aber 10 oder 12 mal Goto zu benutzen ist einfach zu viel.

Thx
DarkAngel
Deutscher Blitz Basic Chat

Gina

BeitragMo, Nov 15, 2004 18:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Gebe DarkAngel vollkommen recht. GOTOs sind böse... Twisted Evil

Versuche mal, dein Programm so umzuschreiben, dass du die GOTOs in Funktionen umwandelst.

Ansonsten kann ich auf den ersten Blick nur sehen, dass die Variable Ergebnis nicht als String definiert worden ist...?

Gina.
www.jk-spiele.de

eXceptION

BeitragMo, Nov 15, 2004 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn man goto richtig benutzt, kann es verdammt hilfreich sein... (es muss die code eben nicht unlesbar machen)
Norweger...

Spreche aber verdammt gut 8086
 

hot-bit

Gast

BeitragMo, Nov 15, 2004 19:47
Antworten mit Zitat
Hoi..

Genau ! Ist auch meine Meinung.

Toni

TBP1

BeitragDi, Nov 16, 2004 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich werde nie wieder Goto's verwenden Wink . Hab ich mir einfach angewöhnt, als ich meine ersten kleinen Testprogramme mit BB geschrieben hab. Übrigens hattest Gina Recht, hab vergessen die Variable als String zu definieren(passiert jedem mal Wink )

Gina

BeitragDi, Nov 16, 2004 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Freut mich... Wink

Naja, das mit den GOTOs ist halt ne Wissenschaft für sich. Wenn man mit ner Programmiersprache arbeitet, die nichts anderes kennt, dann findet man schon Möglichkeiten, um den Code übersichtlich zu gestalten, aber Functions etc. wurden ja schließlich dafür erfunden, um es allen etwas leichter zu machen und daher sollte man davon auch Gebrauch machen... Wink

Viel Spaß noch, Gina.
www.jk-spiele.de

eXceptION

BeitragMi, Nov 17, 2004 1:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@Gina: goto ist "viel" schneller als funktionen... kommt auf den compiler an... es ist aber nie langsamer...

beispiel: (assembly)

[goto, 1-2 ticks]

Code: [AUSKLAPPEN]
  mov bx, 8
@label:
  dec bx
  jnz @label //goto @label if ebx is <> 0, short, 1 tick
  xor ax, ax
  jmp @ende //goto @ende, short, 1 tick
  nop //for dword alignment
@ende:
  mov ax,4c02 //int 21 command for returning to dos, errorcode 2
  int 21 //dos interrupt


[function, jumps 3-9 ticks]

Code: [AUSKLAPPEN]
  mov bx, 8
  call @label1 //call @label1, short, 2 tick
  xor ax, ax
  nop //for dword alignment
@ende:
  mov ax,4c02
  int 21
  nop //for dword alignment
@label1:
  push es //okay,
  push ds //ein guter compiler
  push si //würde das hier nicht machen...
@label2:
  dec bx
  jnz @label2 //goto @label if ebx is <> 0, short, 1 tick
  pop si //das gute compiler würde auch dies nicht machen
  pop ds //auch dies nicht
  pop es //und auch dies nicht
  ret //return, 1 tick


ausserdem, kannst du das hier machen:
Code: [AUSKLAPPEN]
for y = 0 to 239
  for x = 0 to 319
    if (readpixelfast(x, y) = $00FFFFFF) then goto skipbeide
  next
next

.skipbeide
Norweger...

Spreche aber verdammt gut 8086

Gina

BeitragMi, Nov 17, 2004 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Sicher ist GOTO das schnellste. Ein sehr guter Compiler setzt die Funktionen auch in schnelle GOTOs um, aber der Blitzbasic-Compiler gehört leider nicht dazu Sad(

Naja, was solls, es ging ja auch eigentlich um die Lesbarkeit des Codes Wink

LG, Gina.
www.jk-spiele.de
 

OJay

BeitragDo, Nov 18, 2004 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
wer mit _blitzbasic_ programmiert, hat mit sicherheit andere sorgen, als wieviel pikosekunden man mit einem goto gegenüber einer funktion einsparen kann!

der spruch "kleinvieh macht auch mist" greift hier leider nicht, weil das vieh einfach ZU klein ist! Wink und der preis den man dafür zahlt, ist eh viel zu hoch.


und @exception: ein gute programmierer lässt eine solche situation garnicht erst entstehen, wo er goto's bräuchte...

garret

Betreff: gosub

BeitragDo, Jan 06, 2005 19:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich mich mit funktionen nicht sooo gut auskenne, nehme ich meist gosub. Meiner Meinung nach arbeitet das genau wie eine funktion (abgesehen davon dass es keinen Wert zurückgibt).


Außerdem ist Gosub nicht so verpönt wie Goto. Wink
Ach ja, die guten alten Basic 2.0-Zeiten am C64 (schwärm).
Da war Goto DIE Wunderwaffe. Wink

Ist gosub eigentlich schneller als ne funktion?
>>nec aspera terrent<< (Auch Widerwärtigkeiten schrecken nicht)

dominik

Betreff: Re: gosub

BeitragSa, Jan 08, 2005 16:49
Antworten mit Zitat
Benutzer-Profile anzeigen
garret hat Folgendes geschrieben:
Da ich mich mit funktionen nicht sooo gut auskenne, nehme ich meist gosub. Meiner Meinung nach arbeitet das genau wie eine funktion (abgesehen davon dass es keinen Wert zurückgibt).


Außerdem ist Gosub nicht so verpönt wie Goto. Wink
Ach ja, die guten alten Basic 2.0-Zeiten am C64 (schwärm).
Da war Goto DIE Wunderwaffe. Wink

Ist gosub eigentlich schneller als ne funktion?


Doch geht auch mit Return.
BB+ 1.41|Sempron 2.8|geforce fx5200|1GB DDR|XP home SP2 / prof.

Ebola33

BeitragDo, Jan 13, 2005 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit den gotos. finde ich gar nicht so schlimm.
Eher das hier:

If Derg=20 Or derg=21 Or Derg=22 Or Derg=23 Or Derg=24 Or derg=25 Or derg=26 Or derg=27 Or derg=28 Or derg=29

if Derg>19 and Derg<30

besser so. Wink
ansteckend... Wink
verstaubtes Projekt : http://www.mitglied.lycos.de/ebola33/

Vertex

BeitragFr, Jan 14, 2005 0:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Lol, also der Vergleich mit JMP und CALL hinkt extrem. Am besten noch nur mit Globalen Variablen arbeiten, um PUSH/POP zu vermeiden usw. In großen Projekten wird OOP eingesetzt, das sind auch Speedkiller, aber bei tausenden Zeilen Code nimmt man soetwas gerne in Kauf. Also auf Goto und Gosub(wobei Gosub auch mit CALL aufgerufen wird) kann ein guter Programmierer immer verzichten.
mfg olli
vertex.dreamfall.at | GitHub

bear1

BeitragMo, Feb 07, 2005 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß echt nich, was ihr alle immer mit eurem Goto habt. Ist doch en wunderbarer Befehl! Und wenn man eine Funktion hat, ändert das auch nichts daran, dass du woanders hinspringst. Ist nur umständlicher zu schreiben.
Ja, ne...

Zum virtuellen Staat Eranien:
http://www.eranien.de
Zu meinem Blog:
http://www.erixpage.de

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group