Array-Wirrsinn

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

DAK

Betreff: Array-Wirrsinn

BeitragMi, Okt 30, 2013 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bastel ja gerade an einem BitzBasic-Compiler, und bin dabei auf das hier gestoßen:


BlitzBasic: [AUSKLAPPEN]
Dim test(5)
For i=100 To 120
test(i) = i+10
Print(test(i))
Next

Delay(1000)


Warum funktioniert das?

BlitzBasic: [AUSKLAPPEN]
Dim test(5)
For i=100 To 120
test(i) = i+10
Next
For i=100 To 120
Print(test(i))
Next

Delay(1000)


Funktioniert aber nicht.


Auch das Beispiel aus der Hilfe liefert komische Ergebnisse.

BlitzBasic: [AUSKLAPPEN]
Graphics 640,480,0,2
SetBuffer BackBuffer ()

Dim x(100), y(100), v(100)

For i = 0 To 100
x(i) = Rnd (0,639)
y(i) = Rnd (0,479)
v(i) = Rnd (1,10)
Next

While KeyHit (1) = 0
Cls
For i = 0 To 100
y(i) = y(i) + v(i)
If y(i) > 479 Then y(i) = 0 : v(i) = Rnd (1,10)
Plot x(i),y(i)
Next
Flip
Wend


Hier habe ich problemlos (schrittweise) die For-Schleifen bis zu 375 gehen lassen (und das obwohl hier drei Arrays mit einer Größe von nur 100 gegeben sind). Bei 376 ist es dann abgestürzt.
Jetzt (mit ansonsten unverändertem Code) stürzt es bei 110 schon ab, aber erst, sobald man ESC drückt (über 110 aber auch schon vorher).

Hat irgendwer eine Ahnung, was für einen Wahnsinn Blitz da tut?

Zur Referenz: ich verwende BlitzPlus 1.47 auf Windows 7 64-Bit.

Ist das eine Eigenschaft, die in einem Crosscompiler auch vorhanden sein muss, da er ja außerhalb der Spezifikationen ist?
Gewinner der 6. und der 68. BlitzCodeCompo

Eingeproggt

BeitragMi, Okt 30, 2013 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, etwas veraltete Blitz-Version hast du da.
Bei mir geht schon das erste Beispiel nicht. Bin aber grad zu blöd meine Version rauszufinden, tippe so auf 105.
Ich würd jedenfalls sagen dass du so ein Verhalten nicht unterstützen musst. Siehst ja selber, dass Programmierer damit nix anfangen können Wink

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Midimaster

BeitragMi, Okt 30, 2013 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich schätze mal, dass hier der DEBUG MODE seine Arbeit nicht tut! Ohne ihn kannst Du die Dimension eines Arrays einfach sprengen. Dann wird plötzlich in das RAM hinter dem Array reingeschrieben.

Sowas geht solange gut, bis man auf Bereiche mit Programm-Code trifft und dort quasi was "rein-poked". Dort erfolgt dann der Absturz. Das ist meist die eigene EXE, kann aber auch mal BlitzBasic sein, oder im schlimmsten Fall ein komplett anderer Prozess, z.B. Windows.

Der DEBUG Mode versucht solche Fehler zu erkennen und antwortet dann mit einer Fehlermeldung. Dazu muss aber jeder Deiner Befehlsschritte immer und jedesmal durch den DEBUGGER. Das kostet Performance. Darum kann man den DEBUGGER auch ausschalten. Das sollte man aber immer erst tun, wenn man das eigene Programm umfangreich getestet hat.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

DAK

BeitragMi, Okt 30, 2013 12:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Sehr interessant. Ich bin inzwischen wohl doch zu sehr Java-verwöhnt. Mir ist gar nicht in den Sinn gekommen, dass Blitz die Arraygrößen nicht checken würde! Ich hab zuerst gedacht, dass Blitz eventuell irgendeine Art von Map als Arraymissbraucht, das hätte aber auch keinen Sinn gemacht. Macht aber Sinn. Sowei ich mich entsinne kompiliert Blizt ja über c, und das macht das ja auch so.

Ich hab gedacht, dass ich den Debugger eingeschalten gehabt habe. Wird dem wohl nicht so gewesen sein.

Da es also Fehlverhalten ist, werde ich das so nicht einbauen (vor allem auch, weil ich keine Ahnung habe, wie man sowas in Java abbilden sollte, so sicher wie Java mit sowas sonst umgeht).

Danke für die Hilfe!
Gewinner der 6. und der 68. BlitzCodeCompo

BtbN

BeitragMi, Okt 30, 2013 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Midimaster hat Folgendes geschrieben:
... oder im schlimmsten Fall ein komplett anderer Prozess, z.B. Windows.


Nein, das ist absolut ausgeschlossen.

DAK

BeitragMi, Okt 30, 2013 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, das Problem gab es ja nur im Real Mode. Durch den virtuellen Speicher hat ja jedes Programm im Grunde einen eigenen RAM-Speicher.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group