programm hängt rechner auf

Anfängerfragen zum Programmieren mit PureBasic.
ThomasT
Beiträge: 7
Registriert: 26.06.2005 21:24
Wohnort: Nürnberg

programm hängt rechner auf

Beitrag von ThomasT »

Hi

ich hab mir ein Programm kopiert, um in einem Spiel den Highscore eingeben zu können.
Das kopierte Programm funktioniert auch astrein.

Wenn ich es aber in mein Programm integrieren will, hängt sich bei jedem Versuch mein Rechner auf und ich muss neu booten. :-( extrem lästig.

Jetzt 2 Fragen:

1. Was ist an meinem Programm falsch? siehe unten (Wahrscheinlich irgendein bescheuerter Anfängerfehler.)

2. Wie kann man verhindern, dass man bei solchen Fehlern ständig neu booten muss?


Danke
Thomas

Code: Alles auswählen

#Nein = 0
#Ja = 1
#False = 0
#True = 1
;- Geometrie #############################################################
#Bildschirm_hoehe = 600
#Spielfeld_x = 0
#Spielfeld_y = 0
#Spielfeld_hoehe = 500
#Spielfeld_breite = 800

level=2

; -------------------------------------------------------------------------------
Procedure OEscapeKeyHit()
  ExamineKeyboard() 
  If KeyboardPushed(#PB_Key_Escape)
    ProcedureReturn 1
  EndIf
  ProcedureReturn 0
  
EndProcedure


; -------------------------------------------------------------------------------
Procedure.s InputProcedure(x,y)
  Static Name$, LastCursorTime, ShowCursor, BackPushed
  
  While 1
    ; Input holen
    Name$ + KeyboardInkey()
    
    ; Backspace erlauben zum loeschen
    If KeyboardPushed(#PB_Key_Back) And BackPushed=0
      Name$ = Left(Name$,Len(Name$)-1)
      BackPushed=ElapsedMilliseconds()
    ElseIf BackPushed
      If ElapsedMilliseconds() >= BackPushed+150
        BackPushed=0
      EndIf
    EndIf
    
    ; Laenge begrenzen
    len=Len(Name$)
    If len>25
      Name$ = Left(Name$,len-1)
    EndIf
    
    ; Fenster zeichnen
    If StartDrawing(ScreenOutput())
      Box(x+5,y+5,300,100,$404040)
      Box(x,y,300,100,$D7D628)
      Box(x,y,300,22,$579FA8)
      Line(x    ,y,300,  0,$FFFFFF):Line(x,y    ,  0,100,$FFFFFF)
      Line(x+300,y,  0,100,$000000):Line(x,y+100,300,  0,$000000)
      Locate(x+2,y+2)
      DrawingMode(1)
      DrawText("Bitte Name eingeben")
      Box(x+09,y+29,282,24,$000000)
      Box(x+10,y+30,280,22,$FFFFFF)
      Locate(x+13,y+33)
      DrawText(Name$)
      
      ; cursor blinken lassen
      time = ElapsedMilliseconds()
      If time >= LastCursorTime+500
        LastCursorTime=time
        ShowCursor ! 1
      EndIf
      ; cursor zeichnen
      If ShowCursor
        ;Line(x+13+TextLength(Name$),y+32,0,18,$000000)
        Line(x+13+TextLength(Name$),y+50,10,0,$000000)
      EndIf
      
      StopDrawing()
    EndIf
    
    If KeyboardReleased(#PB_Key_Return) And Name$
      ProcedureReturn Name$
    EndIf
  Wend
EndProcedure
; 
; -------------------------------------------------------------------------------
Procedure OShowFinishScreen()
  Shared Gesamtzeit
  
  StartDrawing(ScreenOutput())
  DrawingMode(1)   
  Box(0, 0, #Spielfeld_breite, #Bildschirm_hoehe)     
  
  Locate(360, #Bildschirm_hoehe/2 ): DrawText("Geschafft..")
  Locate(360, #Bildschirm_hoehe/2+30 ): DrawText("Verbrauchte Zeit:  " + Str(Gesamtzeit) + " Sekunden" )
  
  StopDrawing()
  FlipBuffers() 
  
EndProcedure

; -------------------------------------------------------------------------------
Procedure OCheckIfGameFinished()
  Shared Startzeit, Gesamtzeit, level
  Protected Name$, Status
  
    Repeat
      ExamineKeyboard()
      If IsScreenActive()
        FlipBuffers()
        ClearScreen($3A,$65,$98)
        If Status = 0
          Name$ = InputProcedure(#Spielfeld_breite/2-150,#Spielfeld_hoehe/2-50)
          If Name$
            Status+1
          EndIf
        Else
          If StartDrawing(ScreenOutput())
            FrontColor($FF,$FF,$FF)
            DrawingMode(1)
            Locate(100,100): DrawText("Ihre Eingabe:")
            Locate(100,130): DrawText("Vielen Dank! Bitte drcken sie eine Taste...")
            FrontColor($00,$00,$00)
            Locate(200,100): DrawText(Name$)
            StopDrawing()
          EndIf
          If KeyboardPushed(#PB_Key_All)
            Quit=#True
          EndIf
        EndIf
      EndIf
    Until Quit     
    
    CloseScreen()
    
    End  ; Programm beenden
  
EndProcedure



If InitSprite()=0 Or InitKeyboard()=0
  MessageRequester("ERROR","Cant initialize game engine!"):End
EndIf

OpenScreen(1024,768,16,"Ballerkurs")  

OCheckIfGameFinished()
[/code]
Zuletzt geändert von ThomasT am 06.08.2005 22:17, insgesamt 1-mal geändert.
Denke nie gedacht zu haben denn das Denken der Gedanken ist gedankenloses Denken und wer denkt er denkt der denkt nur dass er denkt aber denken tut er nie.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Benutz doch bitte Codetags. :allright:
Aber so sollte es besser gehen (auch wenn ich keinen echten Fehler gefunden habe)

Code: Alles auswählen



#Nein = 0
#Ja = 1
#False = 0
#True = 1
;- Geometrie #############################################################
#Bildschirm_hoehe = 600
#Spielfeld_x = 0
#Spielfeld_y = 0
#Spielfeld_hoehe = 500
#Spielfeld_breite = 800

level=2

; -------------------------------------------------------------------------------
Procedure OEscapeKeyHit()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
ProcedureReturn 1
EndIf
ProcedureReturn 0

EndProcedure


; -------------------------------------------------------------------------------
Procedure.s InputProcedure(x,y)
Static Name$, LastCursorTime, ShowCursor, BackPushed

While 1

If OEscapeKeyHit() = 1 : End : EndIf  ; Sehr wichtig
; Input holen
Name$ + KeyboardInkey()

; Backspace erlauben zum loeschen
If KeyboardPushed(#PB_Key_Back) And BackPushed=0
Name$ = Left(Name$,Len(Name$)-1)
BackPushed=ElapsedMilliseconds()
ElseIf BackPushed
If ElapsedMilliseconds() >= BackPushed+150
BackPushed=0
EndIf
EndIf

; Laenge begrenzen
len=Len(Name$)
If len>25
Name$ = Left(Name$,len-1)
EndIf

; Fenster zeichnen
If StartDrawing(ScreenOutput())
Box(x+5,y+5,300,100,$404040)
Box(x,y,300,100,$D7D628)
Box(x,y,300,22,$579FA8)
Line(x ,y,300, 0,$FFFFFF):Line(x,y , 0,100,$FFFFFF)
Line(x+300,y, 0,100,$000000):Line(x,y+100,300, 0,$000000)
Locate(x+2,y+2)
DrawingMode(1)
DrawText("Bitte Name eingeben")
Box(x+09,y+29,282,24,$000000)
Box(x+10,y+30,280,22,$FFFFFF)
Locate(x+13,y+33)
DrawText(Name$)

; cursor blinken lassen
time = ElapsedMilliseconds()
If time >= LastCursorTime+500
LastCursorTime=time
ShowCursor ! 1
EndIf
; cursor zeichnen
If ShowCursor
;Line(x+13+TextLength(Name$),y+32,0,18,$000000)
Line(x+13+TextLength(Name$),y+50,10,0,$000000)
EndIf

StopDrawing()
EndIf


flipbuffers() ; <<< NEU !!!!

If KeyboardReleased(#PB_Key_Return) And Name$
ProcedureReturn Name$
EndIf
Wend
EndProcedure
;
; -------------------------------------------------------------------------------
Procedure OShowFinishScreen()
Shared Gesamtzeit

StartDrawing(ScreenOutput())
DrawingMode(1)
Box(0, 0, #Spielfeld_breite, #Bildschirm_hoehe)

Locate(360, #Bildschirm_hoehe/2 ): DrawText("Geschafft..")
Locate(360, #Bildschirm_hoehe/2+30 ): DrawText("Verbrauchte Zeit: " + Str(Gesamtzeit) + " Sekunden" )

StopDrawing()
FlipBuffers()

EndProcedure

; -------------------------------------------------------------------------------
Procedure OCheckIfGameFinished()
Shared Startzeit, Gesamtzeit, level
Protected Name$, Status

Repeat
ExamineKeyboard()
If IsScreenActive()
FlipBuffers()
ClearScreen($3A,$65,$98)
If Status = 0
Name$ = InputProcedure(#Spielfeld_breite/2-150,#Spielfeld_hoehe/2-50)
If Name$
Status+1
EndIf
Else
If StartDrawing(ScreenOutput())
FrontColor($FF,$FF,$FF)
DrawingMode(1)
Locate(100,100): DrawText("Ihre Eingabe:")
Locate(100,130): DrawText("Vielen Dank! Bitte drcken sie eine Taste...")
FrontColor($00,$00,$00)
Locate(200,100): DrawText(Name$)
StopDrawing()
EndIf
If KeyboardPushed(#PB_Key_All)
Quit=#True
EndIf
EndIf
EndIf
Until Quit

CloseScreen()

End ; Programm beenden

EndProcedure



If InitSprite()=0 Or InitKeyboard()=0
MessageRequester("ERROR","Cant initialize game engine!"):End
EndIf

OpenScreen(1024,768,16,"Ballerkurs")

OCheckIfGameFinished()
Edit: Doch examineKeyboard() vergessen :wink:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
ThomasT
Beiträge: 7
Registriert: 26.06.2005 21:24
Wohnort: Nürnberg

Danke Batze

Beitrag von ThomasT »

Mit deiner Version funktioniert es, auch wenn ich noch nicht verstehe warum - ich werds schon noch kapieren.

Kannst du mir vielleicht einen Tip zur 2. Frage geben? Wie verhindere ich, dass sich der Rechner aufhängt wenn ich was falsch programmiere?

Und was sind Codetags? Wie verwende ich die? Wo steht was dazu?

Meinst du das? :|

Code: Alles auswählen

#Konstante = 1
Denke nie gedacht zu haben denn das Denken der Gedanken ist gedankenloses Denken und wer denkt er denkt der denkt nur dass er denkt aber denken tut er nie.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Re: Danke Batze

Beitrag von Andre »

ThomasT hat geschrieben:Wie verhindere ich, dass sich der Rechner aufhängt wenn ich was falsch programmiere?
Auf jeden Fall den Debugger einschalten.
Sollte erstmal viele Probleme abfangen...
ThomasT hat geschrieben: Und was sind Codetags? Wie verwende ich die? Wo steht was dazu?

Meinst du das? :|

Code: Alles auswählen

#Konstante = 1
Du bringst es ja. :)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Tja, ich glaube dein Rechner hat sich garnicht aufgehängt, sondern er hing in einer Endloschleife fest.

Code: Alles auswählen

While 1 
;...
wend

; <- schlecht da endlosschleife

repeat
until keyboardpushed(#PB_Key_Escape)

; <- gut, da man immer abbrechen kann
Das ist übrigens eins der wenigen Dinge was der Debugger nicht erkennt.
:allright: :freak:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
ThomasT
Beiträge: 7
Registriert: 26.06.2005 21:24
Wohnort: Nürnberg

Danke für die Tips

Beitrag von ThomasT »

Ich hab jetzt verstanden warum es sich aufhängt.
Allerdings hätte ich erwartet, dass ich wenigstens mit Strg+Alt+Entf
das wild gewordene Programm abschießen kann.

Warum geht das hier nicht? :|

Gruß Thomas
Denke nie gedacht zu haben denn das Denken der Gedanken ist gedankenloses Denken und wer denkt er denkt der denkt nur dass er denkt aber denken tut er nie.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Mit Alt + Strg + Entf wird der Taskmanager zwar aufgerufen, aber der Screen liegt davor, weshalb man ihn nicht sehen kann. :freak:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

gehen schon, blos bei ner unendlichschleife und nehzm von haus aus lahmen pc kanns da schon ne halbestunde dauern biste im taskmanager bist ^^
darum würde ich in endlosschleifen immer ne notbremse einbaun (ne taste drücken und er bricht ab)
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Dafür muss der PC nicht lahm sein.
Das Problem ist, dass das Programm nicht wirklich abgestürzt ist, sondern einfach nur nichts zu sehen ist, wenn man flipbuffers vergisst.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Antworten