Array index out of bounds

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Fafnir

Betreff: Array index out of bounds

BeitragDo, März 03, 2005 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!!

Ich bin gerade dabei eine Routine zu schreiben, mit der ein dreidimensionales Labyrinth vor einem Spieler in der first-person-perspektive aufgebaut wird. Man soll sich in "Sprüngen" bewegen und es soll wie in einem klassischen Rollenspiel aussehen (Wizardry zum Beispiel). Die Information, wo ein Wandblock steht, ist in einem Array gespeichert. 1 ist ein Block, 0 ist nix.
Man "sieht" drei Felder nach vorne und am weitesten in der Breite sieben Felder (also von der Mitte drei nach links und drei nach rechts) und das Bild wird von außen nach innen und hinten nach vorne (auf den Spieler zu) aufgebaut, damit Blöcke, die neu gezeichnet werden, perspektivisch richtig die dahinterliegenden verdecken. So weit, so gut Very Happy

Kann sein daß das alles etwas umständlich ist, aber der Code ist soweit sauber und ich wollte es halt mal so machen, auch um mich in BB einzugewöhnen.

Mit foldendem Code (Auszug) wollte ich die Arrayfelder in einer bestimmten Position zur Spielerposition auslesen:

Code: [AUSKLAPPEN]
If richtung=0         ;wenn blick nach norden
   If blocktype(dungeonx-3,dungeony-3)=1 Then blockeinseins()
   If blocktype(dungeonx-2,dungeony-3)=1 Then blockeinszwei()


Jetzt hab ich aber das Problem, daß er mir in der ersten Zeile gleich den Fehler "Array index out of bounds" bringt. Ich habe gemerkt, daß es daran liegt, daß das Programm versucht, eine Position blocktype(-3,-3) abzufragen (eigentlich sollte er das ja nicht. eine solche Position existiert nicht, und der Spieler ist beim Start auf position 10,10 zum Test - aber den Fehler bringt er nicht wenn ich nicht dungeon-3 sondern +3 abfrage z.B.).

Jetzt habe ich versucht, vorher mal ein Array mit -2 to 16 mit nullen zu füllen. Aber das scheint auch nicht zu gehen. Arrays dürfen wohl keine negativen Zahlen enthalten (das tun sie eigentlich auch gar nicht in der normalen Version, aber da der Code dungeonx-3 enthält, scheint BB das intern mit abzufragen....). Hat da jemand eine Lösung für mich parat?! Confused

Ich hoffe ich hab das Problem einigermaßen verständlich rübergebracht...
 

Dreamora

BeitragDo, März 03, 2005 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit dem Code kann man dir leider nicht helfen.

ich vermute einfach mal, dass dungeonx von 0 bis irgendwas geht oder von 1 bis irgendwas, was dann automatisch falsch werden muss.

Warum hast du da genau die -3 und -2?
Eine alternative ist erst abzufragen ob dungeonx-3 >= 0 und <= grösster Index und erst dann auf den Array zuzugreifen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Fafnir

BeitragDo, März 03, 2005 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh.. danke für die schnelle Reaktion Wink

hier mal wie ich ein Testfeld generiert habe:

Code: [AUSKLAPPEN]
Dim blocktype(14,14)


Restore dungeondaten


For dungeony=1 To 14
For dungeonx=1 To 14
Read blocktype(dungeony,dungeonx)
Next
Next


.dungeondaten

Data  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0
Data  0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0
Data  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Data  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0


Dungeony und x sind hier übrigens "vertauscht" damit es auch später nachvollziehbar abzurufen ist.

Ich sagte ja schon daß ich ja in Wirklichkeit keine -3 beispielsweise abrufe, weil das gar nicht existiert. Zumindest am Anfang kann dungeonx und y in der Abfrage nur 7 sein, da dungeonx und y Anfangs auf Wert 10 gesetzt werden.

Das Problem scheint, daß BB intern, also im Hintergrund, trotzdem alle Möglichkeiten von -3 ab durchgeht und dann sofort einen Fehler bringt. Das heißt, daß dein Vorschlag leider auch nichts bringen würde.

Eine andere Möglichkeit wäre vielleicht, pro Abfrage eine Zwischenvariable abzufragen, nach dem Muster zwischenx=dungeonx-3 (wäre also 7) und dann blocktype(zwischenx,zwischeny) abzufragen. Aber das wäre doch auch ziemlich umständlich (falls es keinen anderen Weg gibt)?!

Edit: ach so, deine Frage: dungeonx-3 rufe ich ab, um zu sehen, ob in der position drei felder links vom spieler eine wand steht oder nicht.

BladeRunner

Moderator

BeitragDo, März 03, 2005 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Welchen wert hat dungeonx wenn das programm aussteigt (siehe debugger). hast du ne schleife die die werte durchgeht?

Du bist selbst dafür verantwortlich Grenzen einzuhalten und solche Fehler abzufangen.

Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Ralf

BeitragDo, März 03, 2005 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Dungeonx und Dungeony werden zweifelsfrei den Wert 0 haben.
Hast Du die beiden Variabeln vielleicht nicht Global gesetzt?

Fafnir

BeitragDo, März 03, 2005 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Verdammt, ich bin halt ein blutiger Anfänger Laughing

Gerade wollte ich schreiben, daß ich die Variablen, die ich in der Hauptroutine definiert habe, nicht Global gesetzt habe, und sie dann durch den Funktionsaufruf aus der extra-.bb wieder auf 0 gesetzt wurden. Dummerweise hat Ralf doch noch vorher das richtig beantwortet und hat mir teilweise meinen Triumph geraubt Confused Razz

Mann... danke aber Wink

Jetzt gehts grundsätzlich, die Darstellung stimmt zwar nicht, aber das sind jetzt Details in der Zeichenroutine der Blöcke - die fixe ich morgen Embarassed

SpionAtom

Betreff: Re: Array index out of bounds

BeitragFr, März 04, 2005 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
[quote="Fafnir"]Hallo!!

Code: [AUSKLAPPEN]
If richtung=0         ;wenn blick nach norden
   If blocktype(dungeonx-3,dungeony-3)=1 Then blockeinseins()
   If blocktype(dungeonx-2,dungeony-3)=1 Then blockeinszwei()


So wie ich das sehe, brauchst du den Code eigentlich nur um eine Sicherheitsabfrage zu erweitern:

Code: [AUSKLAPPEN]
If richtung=0         ;wenn blick nach norden
   if dungeonx-3 >= 0 and dungeony-3 >= 0 then If blocktype(dungeonx-3,dungeony-3)=1 Then blockeinseins()
   if dungeonx-2 >= 0 and dungeony-3 >= 0 then  If blocktype(dungeonx-2,dungeony-3)=1 Then blockeinszwei()


Du siehst also, wie ich das machen würde.
Aber das Arrays keine negativen Werte beinhalten können ist mir neu - muss ich gleich mal testen! Confused

BladeRunner

Moderator

BeitragFr, März 04, 2005 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht der Wert darf nicht negativ sein, sondern (was Du ja schon mit deiner Sicherheitsabfrage gelöst hast) der Index.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

SpionAtom

BeitragFr, März 04, 2005 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach so... Embarassed

Hab mich schon gewundert Razz

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group