2015-07-01 2 views
0

я получаю ошибку ArrayOutOfBoundException: 15 at line 110:ArrayOutOfBoundException Ошибка в 2D массива

System.out.println(coordinates[k][l]); 

При попытке запустить этот код:

import TUIO.*; 
TuioProcessing tuioClient; 

int cols = 15, rows = 10; 
boolean[][] states = new boolean[cols][rows]; 
String[][] coordinates = new String[cols][rows]; 
int videoScale = 50; 

// these are some helper variables which are used 
// to create scalable graphical feedback 
int x, y, i, j, k, l; 
float cursor_size = 15; 
float object_size = 60; 
float table_size = 760; 
float scale_factor = 1; 
PFont font; 

boolean verbose = false; // print console debug messages 
boolean callback = true; // updates only after callbacks 



void setup(){ 
    size(500,500); 
noCursor(); 

    noStroke(); 
    fill(0); 

    // periodic updates 
    if (!callback) { 
    frameRate(60); //<>// 
    loop(); 
    } else noLoop(); // or callback updates 

    font = createFont("Arial", 18); 
    scale_factor = height/table_size; 

    // finally we create an instance of the TuioProcessing client 
    // since we add "this" class as an argument the TuioProcessing class expects 
    // an implementation of the TUIO callback methods in this class (see below) 
    tuioClient = new TuioProcessing(this); 

} 
void draw(){ 
    // Begin loop for columns 
    for (k = 0; k < cols; k++) { 
    // Begin loop for rows 
    for (l = 0; l < rows; l++) { 

     // Scaling up to draw a rectangle at (x,y) 
     int x = k*videoScale; 
     int y = l*videoScale; 

     fill(255); 
     stroke(0); 


for (int i = 0; i < cols; i++) { 
    for (int j = 0; j < rows; j++) { 

coordinates[i][j] = String.valueOf((char)(i+65)) + String.valueOf(j).toUpperCase(); 

    } 
} 
    /* 
     //check if coordinates are within a box (these are mouse x,y but could be fiducial x,y) 
     //simply look for bounds (left,right,top,bottom) 
     if((mouseX >= x && mouseX <= x + videoScale) && //check horzontal 
      (mouseY >= y && mouseY <= y + videoScale)){ 
     //coordinates are within a box, do something about it 
     System.out.println(coordinates[k][l]); 
     //you can keep track of the boxes states (contains x,y or not) 
     states[k][l] = true; 

     if(mousePressed) println(k+"/"+l); 

     }else{ 

     states[k][l] = false; 

     } 

*/ 
     rect(x,y,videoScale,videoScale); 
    } 
    } 

    textFont(font,18*scale_factor); 
    float obj_size = object_size*scale_factor; 
    float cur_size = cursor_size*scale_factor; 

    ArrayList<TuioObject> tuioObjectList = tuioClient.getTuioObjectList(); 
    for (int i=0;i<tuioObjectList.size();i++) { 
    TuioObject tobj= tuioObjectList.get(i); 
    stroke(0); 
    fill(0,0,0); 
    pushMatrix(); 
    translate(tobj.getScreenX(width),tobj.getScreenY(height)); 
    rotate(tobj.getAngle()); 
    rect(-obj_size/2,-obj_size/2,obj_size,obj_size); 
    popMatrix(); 
    fill(255); 
    text(""+tobj.getSymbolID(), tobj.getScreenX(width), tobj.getScreenY(height)); 
    System.out.println(tobj.getSymbolID()+ " " + tobj.getX()); 

    if((tobj.getX()>= x && tobj.getX() <= x + videoScale) && //check horzontal 
      (tobj.getY() >= y && tobj.getY() <= y + videoScale)){ 
     //coordinates are within a box, do something about it 
     System.out.println(coordinates[k][l]); 
    } 
rect(x,y,videoScale,videoScale); 
} 
} 
// -------------------------------------------------------------- 
// these callback methods are called whenever a TUIO event occurs 
// there are three callbacks for add/set/del events for each object/cursor/blob type 
// the final refresh callback marks the end of each TUIO frame 
// called when an object is added to the scene 

/* void addTuioObject(TuioObject tobj) { 
    if (verbose) println("add obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getAngle()); 
} 

// called when an object is moved 
void updateTuioObject (TuioObject tobj) { 
    if (verbose) println("set obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()); 
} 

// called when an object is removed from the scene 
void removeTuioObject(TuioObject tobj) { 
    if (verbose) println("del obj "+tobj.getSymbolID()+" ("+tobj.getSessionID()+")"); 
} 
*/ 

// -------------------------------------------------------------- 
// called at the end of each TUIO frame 
void refresh(TuioTime frameTime) { 
    if (verbose) println("frame #"+frameTime.getFrameID()+" ("+frameTime.getTotalMilliseconds()+")"); 
    if (callback) redraw(); 
} 

Означает ли это, что он присваивает значение на большее место, чем число элементов, которые может содержать этот массив? Как я могу его изменить?

Я не могу найти в коде, где я задал размер массива. Я создал его на основе cols и rows (15 оттуда с тех пор, как я его изменяю, скажем, 4, ошибка становится ArrayOutOfBoundException: 4, но даже с 1 есть ошибка, поэтому я не получаю ее), поэтому я изменил эти значения но я все еще получаю ошибку.

Спасибо за вашу помощь

+0

Пожалуйста, покажите, что у вас есть в строке «110» здесь. – kiruwka

+0

Первые две петли в draw() заканчиваются в конце функции - это то, что вы хотели сделать? (Третий и четвертый петли находятся внутри второго) – Iamsomeone

+0

@kiruwka line 110 - это строка, которую я цитировал сразу после –

ответ

1

Вы пытаетесь использовать переменные k и l вне следующего цикла -

for (k = 0; k < cols; k++) { 
    // Begin loop for rows 
    for (l = 0; l < rows; l++) { 

Похоже, к и л определены в переменной экземпляра области. После того, как закончившийся выше цикл завершится, значения k будут cols, а значение l - строками, и я предполагаю, что длина координат равна (rows, cols).

Таким образом, вы получаете вопрос, когда вы пытаетесь напечатать, что в if состоянии - if((tobj.getX()>= x && tobj.getX() <= x + videoScale) && (tobj.getY() >= y && tobj.getY() <= y + videoScale))

Может быть, вы хотите напечатать его перед циклом для k и l`l переменные более. То есть до следующих линий -

 rect(x,y,videoScale,videoScale); 
    } // <-- Here 'l' loop ends. 
    } // <---- Here 'k' loop ends. 

    textFont(font,18*scale_factor); 
    float obj_size = object_size*scale_factor; 
    float cur_size = cursor_size*scale_factor; 

Или, может быть, вы не хотите, чтобы закончить k и l петлю (те, которые я упоминал в этом начале этого поста) там? Вы пропустили комментирование этой части?

1

Значение для переменной k 15 в конце этого для петли

for (k = 0; k < cols; k++) { 
// Begin loop for rows 
    for (l = 0; l < rows; l++) { 

     // Scaling up to draw a rectangle at (x,y) 
     int x = k*videoScale; 
     int y = l*videoScale; 

     fill(255); 
     stroke(0); 


     for (int i = 0; i < cols; i++) { 
      for (int j = 0; j < rows; j++) { 

      coordinates[i][j] = String.valueOf((char)(i+65)) +  String.valueOf(j).toUpperCase(); 

      } 
     } 
     rect(x,y,videoScale,videoScale); 
    } 
    } 

тогда вы пытаетесь получить доступ к coordinates для порядкового номера coordinates[15][11] на этой линии:

System.out.println(coordinates[k][l]); 

, поэтому вы получаете Исключение.

Надеюсь, это поможет.

Смежные вопросы