2013-02-11 3 views
-3

Я новичок в обработке и создаю эскиз, где холст размером 600px на 600 пикселей заполнен прямоугольными прямоугольниками размером 50px случайного цвета из моей палитры orange[]. Случайное формирование блоков должно быть расположено внутри функции draw() для правильной работы с некоторыми условностями, которые я буду использовать позже.Обработка: Индекс массива за пределами

ошибка, что я получаю ArrayIndexOutOfBoundsException: 12 на этой линии:

randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))]; 

Я не могу понять, почему эта ошибка происходит. Я посмотрел на смежные вопросы, а может быть, его просто потому, что я так ново, но я не могу понять:

int x; //x coordinate 
int y; //y coordinat 
int s = 50; //rect size 
int wide = 600; //canvas width 
int tall = 600; //canvas height 
int[] sIncrement = new int[12];//{s, s*2, s*3, s*4, s*5, s*6}; 

//colors 
int[] oranges = { 
    #773600, #5f3613, #552700, #9c5215, #9c5c26 
}; 
int[] blues = { 
    #004848, #0c3939, #003333, #107979, #1e7979 
}; 
int[] palette = oranges;//holds current color pallete 

//random 
int fillColor = palette[int(random(0, palette.length))]; //random starting fill color 
int changeColor = palette[int(random(0, palette.length))]; //random new color 
int[] randomSize = new int[sIncrement.length]; //array of lots of random s values to place newly color changed blocks 


//setup 
void setup(){ 
    size(wide, tall); 
    background(255); 
    noStroke(); 
    frameRate(24); 

    /*fills sIncrement array with incrementing s values (i.e. if s = 50 then array 
    contains 50, 100, 150, etc...) from 0 to canvas width for use in a conditional statement*/ 
    for(int i = 0; i <= sIncrement.length-1; i++){ 
    sIncrement[i] = s*i; 
    } 

//creates multiple randomSize variables for if() x or y == randomSize[varCreator] 
for(int varCreator = 0; varCreator <= (width/s)+(height/s); varCreator++){ 
    randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))]; 
} 
} 

//draw 
void draw(){ 
    fill(fillColor); //selects random color from palette 

    //draws grid colored boxes with s size 
    for (y = 0; y <= height; y+= s) { 
    for (x = 0; x <= width; x+= s) { 
     if(x == sIncrement[randomSize[1]] && y == sIncrement[randomSize[3]]){ 
     fill(changeColor); //selects random color from palette 
     rect(x, y, s, s); 
     } 

     else{ 
     fill(fillColor); 
    // fill(palette[int(random(0, palette.length))]); //selects random color from palette 
     rect(x, y, s, s); 
     } 
    } 
    } 
} 
+2

Это не похоже на Java. – Vulcan

+0

И даже тогда ... Я не уверен, какая часть сообщения об ошибке сообщает вам, в чем проблема ... запутан. –

+0

@OMGPonies, потому что это именно то, что они есть! – Brannon

ответ

1

Доступ к элементам массива randomSize. Как долго этот массив? Давайте посмотрим, его заявление:

int[] randomSize = new int[sIncrement.length]; 

Итак, это же длины, как и массив sIncrement. Если мы посмотрим немного раньше:

int[] sIncrement = new int[12]; 

Длина sIncrement, и, следовательно, длина randomSize равна 12.

В этом коде:

for(int varCreator = 0; varCreator <= (width/s)+(height/s); varCreator++){ 
    randomSize[varCreator] = sIncrement[int(random(0,sIncrement.length-1))]; 
} 

индекс, который используется для доступа к элементы в массиве randomSize находятся в переменной varCreator, которая идет от 0 до (width/s)+(height/s). Поскольку длина randomSize равна 12, вы можете использовать индексы от 0 до 11 для доступа к элементам, или вы получите сообщение об ошибке.

Итак, если (width/s)+(height/s) не должно быть 12 или более. Сколько это ?

Вот где мы застреваем, потому что ничто в коде не сообщает нам, где объявлены width и height. Мы только знаем, что s 50.

Но у вас есть эти переменные, wide и tall, каждый равен 600. Я собираюсь принять диких угадать и оценить, что где-то в вашем коде вы имеете width = wide и height = tall.

Так (width/s)+(height/s) = (600/50) + (600/50) = 12 + 12 = 24

Вот так. varCreator идет от 0 до 24 (входит в комплект), и поэтому вы исчерпаете границы массива.

+0

Большое вам спасибо за подробное описание! – Brannon

1

Трассировка через код у вас есть это:

int[] sIncrement = new int[12];     // sIncrement initialized with size 12 
int[] randomSize = new int[sIncrement.length];  // randomSize initialized with size 12 
for(... ; varCreator <= (width/s)+(height/s); ...) // varcreator <= 24! 
randomSize[varCreator] = ...      // Problem line 

Когда varcreator >= 12 вы получите исключение индекса массива из пределов. Начните там и исправьте свой код.

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