Array index out of bounds
Übersicht

![]() |
FafnirBetreff: Array index out of bounds |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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?! ![]() Ich hoffe ich hab das Problem einigermaßen verständlich rübergebracht... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh.. danke für die schnelle Reaktion ![]() 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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dungeonx und Dungeony werden zweifelsfrei den Wert 0 haben.
Hast Du die beiden Variabeln vielleicht nicht Global gesetzt? |
||
![]() |
Fafnir |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verdammt, ich bin halt ein blutiger Anfänger ![]() 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 ![]() ![]() Mann... danke aber ![]() Jetzt gehts grundsätzlich, die Darstellung stimmt zwar nicht, aber das sind jetzt Details in der Zeichenroutine der Blöcke - die fixe ich morgen ![]() |
||
![]() |
SpionAtomBetreff: Re: Array index out of bounds |
![]() Antworten mit Zitat ![]() |
---|---|---|
[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! ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach so... ![]() Hab mich schon gewundert ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group