Dim-Fehler? [Gelöst]

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

AMY

Betreff: Dim-Fehler? [Gelöst]

BeitragSa, Jun 09, 2012 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe seit langem mal wieder ein Fehler den ich nicht lösen kann. Ich habe für Blitz3D (sollte auch unter BlitzBasic laufen wenn man RenderWorld rausnimmt) eine Funktion geschrieben um Buttons ähnlich den der Blitz+ Buttons ist. Dabei habe ich festgestellt im Debug Modus läuft es einwandfrei, nur im Release Modus oder in einer Fertigen exe sind, so wie es schein variablen verschoben.

Habe auch mal ein test gemacht einfach ein Dim Feld mit 2 feldern erstellt und über eine schleife 15 felder anzeigen lassen. ich habe mich gewundert das Blitz das mitmacht und das nicht nur 0 rauskommt.

Kann mir das mal einer erklären?

Falls es hilft hier mal der Code von dem Programm.
Code: [AUSKLAPPEN]

;CreateButtons mit B3D
Dim Buttons(1000,3);0=x-position, 1=y-position, 2=breite, 3=höhe
Dim ButtonNames$(1000,1);0=Ansprechname, 1=Anzeigetext
Global ButtonCount, ButtonAction


Graphics3D 700,670,32,2
ClsColor 220,220,220
ButtonNames$(ButtonCount,0)=CreateButton(5,5,100,14,"Test","Test")
ButtonNames$(ButtonCount,0)=CreateButton(105,25,100,14,"Links","Links")
ButtonNames$(ButtonCount,0)=CreateButton(105,45,100,14,"Rechts","Rechts")
ButtonNames$(ButtonCount,0)=CreateButton(105,65,100,14,"Mitte","Mitte")
ButtonNames$(ButtonCount,0)=CreateButton(105,85,100,14,"Oben","Oben")
ButtonNames$(ButtonCount,0)=CreateButton(105,115,100,14,"Unten","Unten")

;MainLoop
Repeat
Cls
RenderWorld
RefreshButtons
If MouseDown(1) Then MT=1:PressedButton=CheckButtons()
If MouseDown(2) Then MT=2:PressedButton=CheckButtons()

If ButtonAction=1 Then
   Select ButtonNames(PressedButton,0)
      Case "Test"
         If MT=1 Then Text 350,335,"TestButton wird mit der Linken Maustaste gedrückt",1,1
         If MT=2 Then Text 350,335,"TestButton wird mit der Rechten Maustaste gedrückt",1,1
       Case "Links"
          If MT=1 Then Text 350,335,"Links Button wird mit der Linken Maustaste gedrückt",1,1
         If MT=2 Then Text 350,335,"Links Button wird mit der Rechten Maustaste gedrückt",1,1
       Case "Rechts"
          Text 350,335,"Rechts Button wurde gedrückt"
       Case "Mitte"
          Text 350,335,"Mitte Button wurde gedrückt"
       Case "Oben"
          Text 350,335,"Oben Button wurde gedrückt"
       Case "Unten"
          Text 350,335,"Unten Button wurde gedrückt"
   End Select
   ButtonAction=0
   MT=0
EndIf
Flip
Until KeyDown

Function CreateButton$(x,y,width,height,ButtonName$,ButtonText$)

If ButtonName$="" Then RuntimeError "ButtonName darf nicht frei sein"
For ButtonExistCheck=0 To ButtonCount
   If Buttonnames(ButtonExistCheck,0)=ButtonName Then RuntimeError "Buttonname Existiert schon"
Next
Buttons(ButtonCount,0)=x
Buttons(ButtonCount,1)=y
Buttons(ButtonCount,2)=width
Buttons(ButtonCount,3)=height
Buttonnames(ButtonCount,1)=ButtonText
ButtonCount=ButtonCount+1
Return ButtonName
End Function

Function RefreshButtons()
For RefreshButton=0 To ButtonCount
   Rect Buttons(RefreshButton,0),Buttons(RefreshButton,1),Buttons(RefreshButton,2),1
   Rect Buttons(RefreshButton,0),Buttons(RefreshButton,1),1,Buttons(RefreshButton,3)
   Rect Buttons(RefreshButton,0)+Buttons(RefreshButton,2),Buttons(RefreshButton,1),1,Buttons(RefreshButton,3)
   Rect Buttons(RefreshButton,0),Buttons(RefreshButton,1)+Buttons(RefreshButton,3),Buttons(RefreshButton,2),1
   Color 255,255,255
   Rect Buttons(RefreshButton,0),Buttons(RefreshButton,1),Buttons(RefreshButton,2),1
   Rect Buttons(RefreshButton,0),Buttons(RefreshButton,1),1,Buttons(RefreshButton,3)
   Color 100,100,100
   Rect Buttons(RefreshButton,0)+Buttons(RefreshButton,2),Buttons(RefreshButton,1),1,Buttons(RefreshButton,3)
   Rect Buttons(RefreshButton,0),Buttons(RefreshButton,1)+Buttons(RefreshButton,3),Buttons(RefreshButton,2)+1,1
   Color 200,200,200
   Rect Buttons(RefreshButton,0)+1,Buttons(RefreshButton,1)+1,Buttons(RefreshButton,2)-1,Buttons(RefreshButton,3)-1,0
   Color 235,235,235
   Rect Buttons(RefreshButton,0)+2,Buttons(RefreshButton,1)+2,Buttons(RefreshButton,2)-3,Buttons(RefreshButton,3)-3,1
   Color 0,0,0
   Text Buttons(RefreshButton,0)+(Buttons(RefreshButton,2)/2),Buttons(RefreshButton,1)+(Buttons(RefreshButton,3)/2),ButtonNames(RefreshButton,1),1,1
Next
End Function

Function CheckButtons$()
mx=MouseX()
my=MouseY()
For ButtonCheck=0 To ButtonCount
If mx>Buttons(ButtonCheck,0) And my>Buttons(ButtonCheck,1) And mx<Buttons(ButtonCheck,0)+Buttons(ButtonCheck,2) And my<Buttons(ButtonCheck,1)+Buttons(ButtonCheck,3) Then
   ButtonAction=1
      Rect Buttons(ButtonCheck,0),Buttons(ButtonCheck,1),Buttons(ButtonCheck,2),1
      Rect Buttons(ButtonCheck,0),Buttons(ButtonCheck,1),1,Buttons(ButtonCheck,3)
      Rect Buttons(ButtonCheck,0)+Buttons(ButtonCheck,2),Buttons(ButtonCheck,1),1,Buttons(ButtonCheck,3)
      Rect Buttons(ButtonCheck,0),Buttons(ButtonCheck,1)+Buttons(ButtonCheck,3),Buttons(ButtonCheck,2),1
      Color 100,100,100
      Rect Buttons(ButtonCheck,0),Buttons(ButtonCheck,1),Buttons(ButtonCheck,2),1
      Rect Buttons(ButtonCheck,0),Buttons(ButtonCheck,1),1,Buttons(ButtonCheck,3)
      Color 255,255,255
      Rect Buttons(ButtonCheck,0)+Buttons(ButtonCheck,2),Buttons(ButtonCheck,1),1,Buttons(ButtonCheck,3)
      Rect Buttons(ButtonCheck,0),Buttons(ButtonCheck,1)+Buttons(ButtonCheck,3),Buttons(ButtonCheck,2)+1,1
      Color 200,200,200
      Rect Buttons(ButtonCheck,0)+1,Buttons(ButtonCheck,1)+1,Buttons(ButtonCheck,2)-1,Buttons(ButtonCheck,3)-1,0
      Color 235,235,235
      Rect Buttons(ButtonCheck,0)+2,Buttons(ButtonCheck,1)+2,Buttons(ButtonCheck,2)-3,Buttons(ButtonCheck,3)-3,1
      Color 0,0,0
      Text Buttons(ButtonCheck,0)+(Buttons(ButtonCheck,2)/2),Buttons(ButtonCheck,1)+(Buttons(ButtonCheck,3)/2),ButtonNames(ButtonCheck,1),1,1
   Return ButtonCheck
EndIf
Next
End Function


und ein screenshot von dem Dim-Fehler:
user posted image
Projekte: www.amyscbi.de
I never comment my sourcecode. What's HARD to write must be HARD to read!
  • Zuletzt bearbeitet von AMY am So, Jun 10, 2012 15:14, insgesamt einmal bearbeitet

Blitzcraft

BeitragSa, Jun 09, 2012 18:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, komisch. Bei mir gibt der selbe Code den Fehler: Array-Index out of Bounds
Besitzt du eine alte Version von Blitz3D?
Screenshot aus meinem ersten Projekt

Xeres

Moderator

BeitragSa, Jun 09, 2012 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Überrascht nicht: Im Debug Modus gibt es zusätzliche Überprüfungen, die im Releasemodus wegfallen. Geh also sicher, dass du nicht in Speicher liest (oder schreibst) der dir nicht gehört.
Und für Buttons benutze lieber Types. Wink
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

AMY

BeitragSa, Jun 09, 2012 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Types sehe ich irgendwie nicht durtch. Habe ich schonmal probiert, aber ist noch nie was geworden. Wie kann man denn überhaupt mit Blitz Speicher auslesen der einem nicht gehört? Sollte doch eigentlich auch wenn der Debugger aus ist eine Fehlermeldung geben.
Und warum führt Blitz das Programm ohne Debugger nicht so aus wie mit Debugger wenn der Debugger keine Fehlermeldung gibt. Gibt es auch Fehler die der Debugger korrigiert aber keine Fehlermeldung dazu ausgibt?

EDIT: Hab mir auch endlich die neue version geladen von Blitz und auch da hab ich den Fehler.
Wenn ich im Debug Modus jeden Button anklicke funktioniert alles wie es soll.
Wenn ich Den debugger ausschalte und den ersten erstellten Button drücke dann passiert gar nichts außer die animation und wenn ich den zweiten button drücke ist die animation und es ist als würde ich den ersten button drücken.
Projekte: www.amyscbi.de
I never comment my sourcecode. What's HARD to write must be HARD to read!
  • Zuletzt bearbeitet von AMY am Sa, Jun 09, 2012 19:09, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Jun 09, 2012 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Man entwickelt seine Programme mit Debugger. Der Überprüft, ob du auf einen gültigen Bereich zugreifst (die Überprüfung dauert) und meldet sich, falls das nicht der Fall ist. Im Releasemodus wird davon ausgegangen, es gibt nur gültige Zugriffe und die kostenintensiven Sicherheitsabfragen fallen weg.
Wenn du über die Arraygrenzen hinaus liest, landest du halt irgendwo im Ram. Lesen kann dann schon einen Fehler auslösen wenn es sich z.B. um einen Grafikartentreiber handelt, der das verhindert. Ganz sicher ist schreiben aber ungesund...
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

AMY

BeitragSa, Jun 09, 2012 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab um einen Doppelpost zu vermeiden meinen adenren Beitrag zu der Zeit aktualisiert als du deinen geschreiben hast.
Sicherlich entwickelt man seine Programme im Debug Modus, somit ist mir dieser Fehler ja gar nicht erst aufgefallen. Erst als ich schon sehr weit war ist mir der Fehler aufgefallen als ich es ohne debugger testen wollte. und so wie es aussieht muss ich wohl wieder von ganz vorne anfangen wenn ich den Fehler nicht finden kann.
Ist mir auch klar das man nicht so einfach werte im Ram ändern sollte, ansonsten könnte es unschöne folgen haben.
Projekte: www.amyscbi.de
I never comment my sourcecode. What's HARD to write must be HARD to read!

Xeres

Moderator

BeitragSa, Jun 09, 2012 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
AMY hat Folgendes geschrieben:
Sicherlich entwickelt man seine Programme im Debug Modus, somit ist mir dieser Fehler ja gar nicht erst aufgefallen.
Wie meinen? Der Debugger meldet "Array Index out of bounds" Plus Zeile, da sollte sich der Ursprung des Problems finden lassen - im Releasemodus passiert nichts, um dich zu warnen.

Aber wie gesagt: Benutze Types - die sind nicht ganz trivial zu Anfang aber wesentlich klarer & ordentlicher.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

AMY

BeitragSa, Jun 09, 2012 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Das meint er aber nur bei dem kurzen code den ich eigentlich nur schnell geschrieben habe um die werte in einem leeren dim feld zu zeigen, welche aber laut deiner aussage andere werte aus dem ram sind und nicht zu dem programm gehören.
Der Screenshot hat nichts mit dem Code darüber zu tun. Ich glaube wir haben uns ein wenig missverstanden.
Das Programm selbst läuft in Debug Mode und im ReleaseMode aber im ReleaseMode werden wohl andere Arrayeinträge verwendet.
Projekte: www.amyscbi.de
I never comment my sourcecode. What's HARD to write must be HARD to read!

Xeres

Moderator

BeitragSa, Jun 09, 2012 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab mir den Code mal genauer angeschaut; Du bist inkonsistent, indem du Arrayeinträge sowohl in der Funktion als auch mit Return verarbeitest:
Code: [AUSKLAPPEN]
ButtonNames$(ButtonCount,0)=CreateButton(5,5,100,14,"Test","Test")
;[...]

Function CreateButton$(x,y,width,height,ButtonName$,ButtonText$)
   
;[...]
   ButtonNames(ButtonCount,1)=ButtonText
   ButtonCount=ButtonCount+1
   Return ButtonName
End Function

Die Globale wird weiter geschaltet und danach nochmal verwendet. Das müsstest du einfach wegkürzen, da die nötige Aktion ja schon in der Funktion abläuft.
Code: [AUSKLAPPEN]
CreateButton(5,5,100,14,"Test","Test")


Wenn du partout keine Types benutzen willst, würde ich dir aber Konstanten zum Ansprechen der Arrays empfehlen:
Code: [AUSKLAPPEN]
Const XPos=0, YPos=1, Breit=2, Hoch=3
;[...]
Buttons(ButtonCount, XPos)=x
Buttons(ButtonCount, YPos)=y
Buttons(ButtonCount, Breit)=width
Buttons(ButtonCount, Hoch)=height

Wäre leserlicher & übersichtlicher.
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

AMY

BeitragSo, Jun 10, 2012 15:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Juhu es funktioniert. Vielen dank Xeres.
Ich weiß auch nicht warum ich nicht selbst auf die Idee gekommen bin das ich den Namen auch in der Funktion mit eintrage. Und jetzt weiß ich auch was der Fehler war das ich eben schon vorher den Zähler erhöht habe und erst später den namen mit dem neuen zähler versehen habe.
Habs jetzt auch mal mit Konstanten für das Dim Feld verwendet, aber meiner Meinung nach werden dadurch die Zeilen zu lang und unübersichtlich. Aber ich weiß auch ads ich da ein schwieriger Fall bin.

Dennoch Frage ich mich warum es dann im DebugMode korrekt funktioniert hat, denn da sind es doch eigentlich die selben Zahlen oder nicht?
Projekte: www.amyscbi.de
I never comment my sourcecode. What's HARD to write must be HARD to read!

Xeres

Moderator

BeitragSo, Jun 10, 2012 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Was da noch mit den Arrays im Debugger abläuft, ist mir auch schleierhaft... Sieht fast so aus, als würde erst der Platz im Speicher gefunden und dann die Funktion ausgeführt.

Das Array ist zu groß und unleserlich? Rolling Eyes
BlitzBasic: [AUSKLAPPEN]

Type TButton
Field x,y,w,h
Field name$, txt$
End Type
Global ActiveButton.TButton

Graphics3D 700,670,32,2
ClsColor 220,220,220
Button_Create(5,5,100,14,"Test","Test")
Button_Create(105,25,100,14,"Links","Links")
Button_Create(105,45,100,14,"Rechts","Rechts")
Button_Create(105,65,100,14,"Mitte","Mitte")
Button_Create(105,85,100,14,"Oben","Oben")
Button_Create(105,115,100,14,"Unten","Unten")

Global mx,my,md1,md2

Repeat
Cls
RenderWorld

mx=MouseX()
my=MouseY()
md1=MouseDown(1)
md2=MouseDown(2)
CheckButtons()

If ActiveButton<>Null Then
Select ActiveButton\name
Case "Test"
If md1 Then Text 350,335,"TestButton wird mit der Linken Maustaste gedrückt",1,1
If md2 Then Text 350,335,"TestButton wird mit der Rechten Maustaste gedrückt",1,1
Case "Links"
If md1 Then Text 350,335,"Links Button wird mit der Linken Maustaste gedrückt",1,1
If md2 Then Text 350,335,"Links Button wird mit der Rechten Maustaste gedrückt",1,1
Case "Rechts"
Text 350,335,"Rechts Button wurde gedrückt"
Case "Mitte"
Text 350,335,"Mitte Button wurde gedrückt"
Case "Oben"
Text 350,335,"Oben Button wurde gedrückt"
Case "Unten"
Text 350,335,"Unten Button wurde gedrückt"
End Select
EndIf
Flip
Until KeyDown

Function Button_Create.TButton(fx,fy,fw,fh, fname$, ftxt$)
Local B.TButton=New TButton
B\x=fx
B\y=fy
B\w=fw
B\h=fh
B\name=fname
B\txt=ftxt
Return B
End Function

Function CheckButtons()
ActiveButton=Null
Local B.TButton
For B = Each TButton
If mx>B\x And my>B\y And mx<B\x+B\w And my<B\y+B\h And (md1 Or md2) Then
Rect B\x,B\y,B\w,1
Rect B\x,B\y,1,B\h
Rect B\x+B\w,B\y,1,B\h
Rect B\x,B\y+B\h,B\w,1
Color 100,100,100
Rect B\x,B\y,B\w,1
Rect B\x,B\y,1,B\h
Color 255,255,255
Rect B\x+B\w,B\y,1,B\h
Rect B\x,B\y+B\h,B\w+1,1
Color 200,200,200
Rect B\x+1,B\y+1,B\w-1,B\h-1,0
Color 235,235,235
Rect B\x+2,B\y+2,B\w-3,B\h-3,1
Color 0,0,0
Text B\x+(B\w/2),B\y+(B\h/2),B\txt,1,1
ActiveButton=B
Else
Rect B\x,B\y,B\w,1
Rect B\x,B\y,1,B\h
Rect B\x+B\w,B\y,1,B\h
Rect B\x,B\y+B\h,B\w,1
Color 255,255,255
Rect B\x,B\y,B\w,1
Rect B\x,B\y,1,B\h
Color 100,100,100
Rect B\x+B\w,B\y,1,B\h
Rect B\x,B\y+B\h,B\w+1,1
Color 200,200,200
Rect B\x+1,B\y+1,B\w-1,B\h-1,0
Color 235,235,235
Rect B\x+2,B\y+2,B\w-3,B\h-3,1
Color 0,0,0
Text B\x+(B\w/2),B\y+(B\h/2),B\txt,1,1
EndIf
Next
End Function

Aber genug bekehrt... Razz
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group