2017-02-11 20 views
1

Я занимаюсь разработкой программы с обработкой 3 последних нескольких дней (с первого взгляда на обработку с момента вступления в компьютерную науку в 2009 году) и продолжал эту проблему :Встроенные переменные, непригодные для использования в некоторых случаях (Обработка 3)

public class PolarMap { 
    ... 
    PVector[][] mapping = new PVector[width][height]; 
    PVector[][] cartesian = new PVector[width][height]; 
    PVector cart = new PVector(); 
    PVector polar = new PVector(); 

    /** 
    Maps every pixel on the cartesian plane to a polar coordinate   
    relative to some origin point. 
    */ 
    public void Map(float originX, float originY){ 
     for (int x=0; x < width; x++){ 
      for (int y=0; y < height; y++){ 
      ... 
      cart.add(x, y); 
      polar.add(r, theta); 
      mapping[x][y] = polar; *** 
      cartesian[x][y] = cart; 
     } 
    } 
    } 
    ... 
} 

на одной линии с ***, я всегда получить массив Index Out Of Bounds выброшен. Я искал SO, Reddit и собственную документацию Processing, чтобы выяснить, почему. Если вы не знакомы с обработкой, ширина и высота - это как встроенные переменные, так и число пикселей, высокое и на вашем холсте, как указано в методе setup() (800x800 в моем случае). По какой-то причине оба массива не инициализировались этим значением - вместо этого они инициализировались значением по умолчанию для этих переменных: 100.

Итак, поскольку это не имело никакого смысла, но это было одно из тех случаев, попытался объявить новые переменные:

int high = height; 
int wide = width; 

и инициализировал массив этими переменными. И разве ты этого не знаешь, это решило проблему. Теперь у меня есть два массива 800x800.

Итак, вот мой вопрос: ПОЧЕМУ были встроенные переменные, которые не работали, как ожидалось, при инициализации массивов, но делали именно то, что они должны были использовать при назначении определенной переменной?

ответ

1

Подумайте, когда переменные width и height получают свои значения. Рассмотрим этот пример эскиз:

int value = width; 

void setup(){ 
    size(500, 200); 
    println(value); 
} 

Если вы запустите эту программу, вы увидите, что он печатает 100, даже если окно 500 пикселей в ширину. Это потому, что линия int value = width; происходит до Ширина установлена!

Для этого, чтобы работать, как и следовало ожидать, вы должны установить переменную valueпосле функция size() называется. Таким образом, вы можете сделать это:

int value; 

void setup(){ 
    size(500, 200); 
    value = width; 
    println(value); 
} 

перемещать любые инициализации внутрь функций setup(), после того, как функция size() называется, и вы будете в порядке.

+0

Инициализатор проблемных массивов и объявление рабочей переменной находятся в одной и той же области, далеко от метода setup() в основном классе. Однако ... Мне просто пришло в голову, что я кормлю карту (originX, originY) со значением, объявленным выше метода setup() в основном классе. Основываясь на том, что вы только что написали, я подозреваю, что это * было причиной моей проблемы. И, только что протестировав, вы абсолютно правы! Удивительно, спасибо! – pyansharp

+0

@pyansharp Да, это не имеет никакого отношения к сфере видимости напрямую, это все в порядке событий. Один простой способ проверить это - добавить команды 'print()', чтобы увидеть, что происходит сначала, но в основном, если 'width' и' height' являются '100', тогда' size() 'еще не был вызван. –