2017-02-11 4 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; 
     } 
    } 
    } 
    ... 
} 

。私はSO、Reddit、Processingの文書を検索して理由を調べました。 Processingに慣れていない場合、幅と高さは組み込みの変数で、高さのピクセル数とキャンバス全体の大きさはsetup()メソッド(私の場合は800x800)で宣言したとおりです。何らかの理由で、両方の配列がこの値に初期化されていませんでした。代わりに、それらの変数のデフォルト値に初期化されていました:100.

したがって、意味がなく、

int high = height; 
int wide = width; 

を宣言し、これらの変数を使用して配列を初期化しました。あなたはそれを知っていないでしょう、それは問題を解決しました。今私は2つの800×800の配列を持っています。

これは私の質問です:組み込み変数は、配列を初期化するために使用すると期待どおりに機能しませんでしたが、定義された変数に代入されたときに、

答えて

1

widthheightの変数が値を取得したときを考えてみましょう。このサンプル・スケッチを考えてみましょう:

int value = width; 

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

あなたがこのプログラムを実行する場合、あなたはそれが窓は500ピクセルの幅であっても、100を印刷していることがわかります。これは、int value = width;行がの前に起きているので、の幅が設定されているためです。

期待通りに動作させるには、の後にvalue変数を設定する必要があります。size()関数が呼び出されます。 size()関数が呼び出された後、setup()関数内に

int value; 

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

移動任意の初期化を、あなたは大丈夫:だから、これを行うことができます。

+0

問題のある配列初期化子と作業変数宣言は、どちらも同じスコープにあり、メインクラスのsetup()メソッドから離れています。しかし....私は、メインクラスのsetup()メソッドの上に宣言された値をMap(originX、originY)に渡していただけです。あなたが書いたものに基づいて、私は*これが私の問題の原因だと思う。そして、テストしただけで、あなたは絶対に正しいです!素晴らしいありがとう! – pyansharp

+0

@pyansharpええ、それは直接スコープとは関係ありません、それはすべてイベントの順です。最初に起こっていることを確認するために 'print()'ステートメントを追加するのが簡単ですが、 'width'と' height'が '100'で' size() 'がまだ呼び出されていないのが基本です。 –

関連する問題