GOTO oder nicht GOTO

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

 

HOT-BIT

Gast

Betreff: GOTO oder nicht GOTO

BeitragSo, Apr 11, 2004 2:20
Antworten mit Zitat
Hi !

Da hier fast jeder schreit: *GOTO ist böse*, möchte ich diejenigen, die das am lautesten schreien, bitten, dieses Code-Schnipsel so zu ändern, daß man kein GOTO mehr braucht.
Möchte ja auch noch was lernen !


Code: [AUSKLAPPEN]
;neue Münze setzen
If MilliSecs()-muenzzeit>10000
.eisprung
  brx=Rand(0,12):bry=Rand(0,12)
  For mue.muenzen=Each muenzen
    If mue\x=brx And mue\y=bry brzz=1:Exit
  Next
  brmit=brmit+1
  If brzz And brmit<5 brzz=0:Goto eisprung
  If brzz brzz=0:brmit=0: Goto zweisprung

  If map(brx,bry)
    mue.muenzen=New muenzen
    mue\x=brx
    mue\y=bry
    mue\stat=Rand(0,12)
    mue\grossklein=1
    mue\zeit=MilliSecs()
    muenzzeit=MilliSecs()
  EndIf
  brzz=0: brmit=0
.zweisprung
EndIf


Es geht darum:
Es wird ein beliebiges Map-Teil ausgesucht, und dahingehend geprüft, ob schon eine Münze da drauf ist. Falls dem so ist, wird das wiederholt. Und zwar bis 5 mal.
Wenn keine Münze auf so einem ausgewähltem Feld ist, dann wird ein neuer Type erstellt, und der Programm-Teil verlassen.
Wenn aber eine Münze drauf sein sollte, muß der Programm-Teil auch nach den 5 Versuchen verlassen werden.

Danke, Toni

Suco-X

Betreff: ....

BeitragSo, Apr 11, 2004 3:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

;neue Münze setzen
If MilliSecs()-muenzzeit>10000
anzahl = 0
repeat
brx=Rand(0,12):bry=Rand(0,12)

For mue.muenzen=Each muenzen
If mue\x=brx And mue\y=bry
brzz=1
Exit
Endif
Next

anzahl = anzahl+brzz

If map(brx,bry) and brzz=0
mue.muenzen=New muenzen
mue\x=brx
mue\y=bry
mue\stat=Rand(0,12)
mue\grossklein=1
mue\zeit=MilliSecs()
muenzzeit=MilliSecs()
anzahl = 5
EndIf

brzz=0: brmit=0
until anzahl >=5
EndIf


So, letztes Edit das war.
bye
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB
  • Zuletzt bearbeitet von Suco-X am Mo, Apr 12, 2004 19:29, insgesamt 4-mal bearbeitet
 

lettorTrepuS

BeitragSo, Apr 11, 2004 3:33
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

Mr.Keks

BeitragSo, Apr 11, 2004 8:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
;neue Münze setzen
If MilliSecs()-muenzzeit>10000
  For brmit = 1 to 5
   brx=Rand(0,12):bry=Rand(0,12)
   For mue.muenzen=Each muenzen
     If mue\x=brx And mue\y=bry brzz=1:Exit
  Next
   If brzz = 0 Then Exit
   brzz = 0
  Next
  If map(brx,bry) And brzz = 0
    mue.muenzen=New muenzen
    mue\x=brx
    mue\y=bry
    mue\stat=Rand(0,12)
    mue\grossklein=1
    mue\zeit=MilliSecs()
    muenzzeit=MilliSecs()
  EndIf
  brzz=0: brmit=0
EndIf
... Falls ich ihn richtig verstanden habe - bin allerdings noch nicht ganz wach .

P.S: EIsprung?! ^^
MrKeks.net
 

lettorTrepuS

BeitragSo, Apr 11, 2004 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.
 

HOT-BIT

Gast

BeitragSo, Apr 11, 2004 12:10
Antworten mit Zitat
Hallo !

Mir persönlich gefällt der Code von Inarie am besten.

Hier habe ich mal die Vergleiche zusammen gestellt :

Bei schlechtesten Bedingungen, also wenn überall schon besetzt ist.


Code: [AUSKLAPPEN]
Graphics 800,600
SeedRnd MilliSecs()

Type muenzen
  Field x,y
End Type

Dim map(12,12)
For i=0 To 12:For j=0 To 12:map(i,j)=1:Next:Next
mue.muenzen=New muenzen
mue\x=4:mue\y=4

brx=4:bry=4


zeit0=MilliSecs()

For o=1 To 10000000
.eisprung
  brx=Rand(0,12):bry=Rand(0,12)
  For mue.muenzen=Each muenzen
    If mue\x=brx And mue\y=bry brzz=1:Exit
  Next
  brmit=brmit+1
  If brzz And brmit<5 brzz=0:Goto eisprung
  If brzz brzz=0:brmit=0: Goto zweisprung
  If map(brx,bry)

  EndIf
  brmit=0
.zweisprung
Next
Print "Hot-Bit : " + (MilliSecs()-zeit0)


zeit1=MilliSecs()
For o=1 To 10000000
  anzahl = 0
  Repeat
    brx=Rand(0,12):bry=Rand(0,12)
      For mue.muenzen=Each muenzen
        If mue\x=brx And mue\y=bry
          brzz=1
          Exit
        EndIf
      Next
    anzahl = anzahl+brzz
    If map(brx,bry) And brzz=0

      anzahl = 5
    EndIf
    brzz=0: brmit=0
    Until anzahl <=5
Next
Print "Suco : " + (MilliSecs()-zeit1)


zeit2=MilliSecs()
For o=1 To 10000000
   ueberspringen = 0
   vonvorne = 1
     While vonvorne=1 And ueberspringen = 0
         vonvorne = 0
         brx=Rand(0,12):bry=Rand(0,12)
         For mue.muenzen=Each muenzen
            If mue\x=brx And mue\y=bry brzz=1:Exit
        Next
        brmit=brmit+1
        If brzz And brmit<5 brzz=0 : vonvorne = 1
        If brzz brzz=0:brmit=0 : ueberspringen = 1
        If ueberspringen = 0
           If map(brx,bry)

          EndIf
          brzz=0: brmit=0
       End If
   Wend
Next
Print "ST : " + (MilliSecs()-zeit2)


zeit3=MilliSecs()

For o=1 To 10000000
For brmit = 1 To 5
   brx=Rand(0,12):bry=Rand(0,12)
      For mue.muenzen=Each muenzen
         If mue\x=brx And mue\y=bry brzz=1:Exit
     Next
     If brzz = 0 Then Exit
     brzz = 0
Next
If map(brx,bry) And brzz = 0

EndIf
brzz=0: brmit=0
Next
Print "Inarie : " + (MilliSecs()-zeit3)

Print:Print "fertig"
WaitKey

End


Jetzt kann man mal sehen, was etwas bringt, und was nicht !
Bei 10 Millionen Durchläufen.

Sagt eure Meinung zur Lesbarkeit und Schnelligkeit der Codes !

Toni
  • Zuletzt bearbeitet von HOT-BIT am So, Apr 11, 2004 12:12, insgesamt einmal bearbeitet

Abrexxes

BeitragSo, Apr 11, 2004 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich schliesse mich HOT-BIT an,das ewige Gelaber um GOTO hat eher Kultkarakter als das es was mit gutem oder schlechtem Proggen zu tun hat.
Goto war zu C64 Zeiten notwendig und eine gute Hilfe.Ich will es nicht missen nur weil einige es UNCOOL finden.
 

HOT-BIT

Gast

BeitragSo, Apr 11, 2004 12:33
Antworten mit Zitat
Hi !

Bei mir, auf einem 2600er, braucht das so um 2000 Millisecs()

Bitte, wenn es geht, Ergebnisse her schreiben.

Danke, Toni

Mr.Keks

BeitragSo, Apr 11, 2004 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
ShadowTurtle hat Folgendes geschrieben:
Inarie & Suco-X: Nun. Ihr versucht schon seit gestern abend hot-bit zu Helfen. Ich jedoch hatte gleich eine lösung vorlegen können. Jetzt sag ich euch mal das geheimnis: [..]. Aber das was ihr hier veranstalten tut muss man ja erst noch richtig debuggen ...
Muuh, ich habe den code erst heute morgen, noch halb schlaftrunken, in einigen minuten dahingeschrieben ^^. trotzdem danke für deinen tipp.... wäre ich so nicht draufgekommen Wink.
@debuggen: dein code ist definitiv falsch - die ueberspringen=0-bedingung müsste noch um vonvorne erweitert werden... das wend ist ohnehin blödsinnig gesetzt, was mir schon vorhin auffiel. dennoch hielt ich es nicht für nötig, darauf hinzuweisen. irgendwie hätte ich wissen müssen, dass dein ego dich dann aber dazu treiben würde, meinen code zu kommentieren. (wo soll da eigentlich was zu debuggen sein? =))


@linux: in diesem fall besteht aber keine zwingende notwendigkeit für goto und hotbits code ist nicht unbeingt einfach zu lesen, finde ich.

@hotbit: bei mir liegen die werte von suco, dir und mir immer recht nah beieinander (immer so +/-20) und haben sich in der folge bei wiederholten durchläufen auch durchaus verschoben (mal war deins das schnellste, mal meins, mal sucox'). alles so um 4330ms auf meinem p3 933mhz mit sdram. st ist etwas weiter abgeschlagen bei 4800 ms.
MrKeks.net
 

.:_]TRaSh

BeitragSo, Apr 11, 2004 13:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh' auch nicht was alle daran so schlimm finden.
Wenn der Befehl nur für n00bs ist sollte man ihn find ich erst garnicht einbauen.
[20:17] IMurDOOM: hm irgendwie is die mitte des viehs kaputt
[20:17] TRaSh: ein bisschen
[20:18] DarkAngel: es tut mir irgend wie leid

Hubsi

BeitragSo, Apr 11, 2004 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
AMD XP 2000+

Suco: 2772
Hot-Bit: 2795
Inarie: 2802
ST: 2909

Der Unterschied ist also nicht so riesig mit ~130 ms, wie man sieht.
Ich persönlich benutze immer noch Goto und bin eigentlich immer gut klargekommen damit Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Bigmichi

BeitragSo, Apr 11, 2004 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
AMD XP Athlon 3200+
(hatte aber mehre Programme auf)

Suco: 1550
Hot-Bit: 1576
Inarie: 1656
ST: 1540
 

HOT-BIT

Gast

BeitragSo, Apr 11, 2004 14:49
Antworten mit Zitat
Hallo !

Ja, danke für die Kommentare !

Hmm, das sollte aber schon bei gleichen Bedingungen getestet werden, denn sonst kann man das nicht gelten lassen.

Inarie's Code sollte schon schneller sein, als der von ST. Denn hier werden ja ein paar Variablen mehr bearbeitet.

Toni

Plasma(alt)

Betreff: also

BeitragSo, Apr 11, 2004 16:50
Antworten mit Zitat
Benutzer-Profile anzeigen
ich finde goto total Evil or Very Mad
weil dann in der exe ein jmp mehr drin ist Razz
DIV is dead !
 

MasterK

BeitragSo, Apr 11, 2004 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
schleifen landen in der exe auch nur als jmps.
es geht darum, dass GOTO einfach zu einem schlechten programmierstil verleitet. wenn es nur genutzt wird, um aus einer stark verschachtelten schleife zu springen ok...
aber viele landen mal ein einer stelle, wo sie überlegen "hm, wie mach ich das jetzt am schnellsten? ach, einfach nen goto reingeklatscht. und hier noch eins und da auch noch und weils so schön is auch da noch".

interessant aber, dass die goto-"vergötterer" oftmals die gleichen sind die der meinung sind, C würde aufgrund der vielen möglichkeiten einen schlechten codestil verursachen

regaa

BeitragSo, Apr 11, 2004 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich find es muss jeder für sich entscheiden ob er goto benutzt oder nicht, ich persönlich find es zu unübersichtlich das zu benutzen, und hab es auch noch nie gemacht Smile .
UltraMixer Professional 3 - Download
QB,HTML,CSS,JS,PHP,SQL,>>B2D,B3D,BP,BlitzMax,C,C++,Java,C#,VB6 , C#, VB.Net

Travis

BeitragSo, Apr 11, 2004 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier noch mal ein Benchmark:

AMD Athlon XP 1800+, WinXP

Suco: 2175ms
Inarie: 2210ms
ST: 2402ms
Hot-Bit: 2522ms

Also etwa 300ms Unterschied bei 10.000.000 Durchäufen. Da kann man die Wahl wohl nach dem besten Codestyle treffen.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragSo, Apr 11, 2004 18:05
Antworten mit Zitat
Benutzer-Profile anzeigen
hab das bei mir auch getestet

Hotbit :2025
Suco : 2018
ST : 2151
Inarie: 2083

aber warum ist meiner so viel schneller wenn ich mir da die Werte von Hubsi ansehe
oder Hot Bit mit einer 2600CPU

bei meinen 2000+Ahtlon
[BB2D | BB3D | BB+]
 

HOT-BIT

Gast

BeitragSo, Apr 11, 2004 18:06
Antworten mit Zitat
Hi !

Das kann wohl nicht sein, oder ?

Bei allen Testläufen war ja der Code von ST der langsamste.
Ist aber interessant. Wahrscheinlich gibt es da noch Prozessor- Kriterien ?

Edit:

Ich habe Win-ME installiert.

Toni

Suco-X

Betreff: ....

BeitragSo, Apr 11, 2004 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@ ST : Ich besprach nach meinen ersten Post der nach 2 Minuten Kam mit Hot Bit das Problem genauer. Darum dauerte es etwas känger. Soll ich dir mal ein geheimnis verraten, dein Code ist scheiße. Du laberst was von deinem effizienten Code aber deinen Brainfuck kann man den Bach runter kippen. Also behalte doch deine schwachsinns Kommentare für dich.
bye
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group