![]() | (トピック一覧へ戻る) |
int[] intArray = new int[5]; //array of five integers double[] values = new double[100]; //array of hundred double IVec[] vectors = new IVec[10]; //array of ten vectors IPoint[] points = new IPoint[10]; //array ten points
上記のスケッチでは、各配列にはまだ要素が格納されていません。 配列に要素を挿入するには以下のスケッチのように操作します。 なお配列の長さにはlengthフィールドからアクセスします。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); int[] intArray = new int[5]; //array of five integers intArray[0] = 1; intArray[1] = 2; intArray[2] = 3; intArray[3] = 4; intArray[4] = 5; //Note that the last member is [4], not [5]. double[] values = new double[100]; //array of hundred double for(int i=0; i < values.length; i++){ values[i] = i*2.5; } IVec[] vectors = new IVec[10]; //array of ten vectors for(int i=0; i < vectors.length; i++){ vectors[i] = new IVec( -i*10, i*10, 0 ); } IPoint[] points = new IPoint[vectors.length]; //array ten points for(int i=0; i < points.length; i++){ points[i] = new IPoint(vectors[i]).clr(i*0.1, 1-i*0.1, 1); }
lengthフィールドの使い方、 特定のインデックスへの要素の参照と挿入の方法に注目してください。 配列Aのi番目の要素をNとして参照するには、"N = A[i];"と記述します。 要素Nをi番目の位置に代入するには、"A[i] = N;"と記述します。
配列の内部構造を図で確認してください。
以下のコードのようにプリント・デバッグ によって実行時の配列の要素を確認することができます。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); int[] intArray = new int[5]; //array of five integers intArray[0] = 1; intArray[1] = 2; intArray[2] = 3; intArray[3] = 4; intArray[4] = 5; //Note that the last member is [4], not [5]. //just checking the contents for(int i=0; i < intArray.length; i++){ IG.p("intArray[" + i + "] = " + intArray[i] ); } double[] values = new double[100]; //array of hundred double for(int i=0; i < values.length; i++){ values[i] = i*2.5; //checking the contents IG.p("values[" + i + "] = " + values[i] ); } IVec[] vectors = new IVec[10]; //array of ten vectors for(int i=0; i < vectors.length; i++){ vectors[i] = new IVec( -i*10, i*10, 0 ); //checking the contents IG.p("vectors[" + i + "] = " + vectors[i] ); } IPoint[] points = new IPoint[vectors.length]; //array ten points for(int i=0; i < points.length; i++){ points[i] = new IPoint(vectors[i]).clr(i*0.1, 1-i*0.1, 1); //checking the contents IG.p("points[" + i + "] = " + points[i] ); }
上記のスケッチを実行すると以下のようなメッセージが出力されます。
sketch_tutorial.setup: intArray[0] = 1 sketch_tutorial.setup: intArray[1] = 2 sketch_tutorial.setup: intArray[2] = 3 sketch_tutorial.setup: intArray[3] = 4 sketch_tutorial.setup: intArray[4] = 5 sketch_tutorial.setup: values[0] = 0.0 sketch_tutorial.setup: values[1] = 2.5 sketch_tutorial.setup: values[2] = 5.0 sketch_tutorial.setup: values[3] = 7.5 sketch_tutorial.setup: values[4] = 10.0 sketch_tutorial.setup: values[5] = 12.5 . . . sketch_tutorial.setup: values[99] = 247.5 sketch_tutorial.setup: vectors[0] = (0.0,0.0,0.0) sketch_tutorial.setup: vectors[1] = (-10.0,10.0,0.0) sketch_tutorial.setup: vectors[2] = (-20.0,20.0,0.0) sketch_tutorial.setup: vectors[3] = (-30.0,30.0,0.0) sketch_tutorial.setup: vectors[4] = (-40.0,40.0,0.0) sketch_tutorial.setup: vectors[5] = (-50.0,50.0,0.0) . . .配列の要素番号の最大値が配列長から1を減算した数であることに注目してください。 配列の要素番号はゼロ(0)から始まるため、長さNの配列の最大要素番号は(N - 1)となります。
lengthフィールドの使い方に注目してください。 或る配列の長さを別の配列の長さに適用することで、両者の長さが必ず等しくなるようにしています。
IPoint[] points = new IPoint[vectors.length];
以下では2つの配列の長さをあえて異なるものにしています。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); IVec[] vectors = new IVec[10]; //array of ten vectors for(int i=0; i < vectors.length; i++){ vectors[i] = new IVec( -i*10, i*10, 0 ); } IPoint[] points = new IPoint[11]; for(int i=0; i < points.length; i++){ points[i] = new IPoint(vectors[i]).clr(i*0.1, 1-i*0.1, 1); }
長さ9の配列の10番目の要素を参照したため、 "ArrayIndexOutOfBoundsExecption"のメッセージと共に実行時エラーが発生します。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); IPoint[] points = new IPoint[3]; // printing the content of the variable. IG.p("points[0]="+points[0]); // this will crash the execution of the code. points[0].clr(1.,0,0);
nullの操作は上記の画像のように"NullPointerException"を発生させます。
このようなエラーは配列操作に限らず、オブジェクトの代入が行われていない変数の操作によっても発生します。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); IPoint pt; // this will cause an error. pt.clr(1.,0,0);
上記のような場合は"The local variable pt may not have been initialized"というエラーメッセージが出力されます。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); int[][] matrix = new int[3][2]; // initialize contents with int matrix[0][0] = 1; matrix[0][1] = 2; matrix[1][0] = 3; matrix[1][1] = 4; matrix[2][0] = 5; matrix[2][1] = 6; double[][] zValues = new double[10][10]; // initialize contents with double for(int i=0; i < zValues.length; i++){ for(int j=0; j < zValues[i].length; j++){ zValues[i][j] = i*2 - j*3; } } IVec[][] controlPoints = new IVec[zValues.length][zValues[0].length]; // initialize contents with IVec for(int i=0; i < controlPoints.length; i++){ for(int j=0; j < controlPoints[i].length; j++){ controlPoints[i][j] = new IVec(i*10,j*10,zValues[i][j]); } } IPoint[][] points = new IPoint[controlPoints.length][controlPoints[0].length]; // initialize contents with IPoint for(int i=0; i < points.length; i++){ for(int j=0; j < points[i].length; j++){ points[i][j] = new IPoint(controlPoints[i][j]).clr(0.5,i*0.1,j*0.1); } }
二次元配列の構造を図で確認します。
外側の配列の長さを求めるには、通常通りlengthフィールドを参照します。
内側の配列の長さを求めるには、外側の配列から要素番号により配列を参照し、
さらにそのlengthフィールドを参照します("M[i].length")。
また内側の各配列の長さは異なりえることに注意してください。
import processing.opengl.*; import igeo.*; size( 480, 360, IG.GL ); int[][][] matrix3 = new int[3][2][2]; // initialize contents with int matrix3[0][0][0] = 1; matrix3[0][0][1] = 2; matrix3[0][1][0] = 3; matrix3[0][1][1] = 4; matrix3[1][0][0] = 5; matrix3[1][0][1] = 6; matrix3[1][1][0] = 7; matrix3[1][1][1] = 8; matrix3[2][0][0] = 9; matrix3[2][0][1] = 10; matrix3[2][1][0] = 11; matrix3[2][1][1] = 12; double[][][] zShift = new double[10][10][10]; // initialize contents with double for(int i=0; i < zShift.length; i++){ for(int j=0; j < zShift[i].length; j++){ for(int k=0; k < zShift[i][j].length; k++){ zShift[i][j][k] = (i + j) * k; } } } IVec[][][] controlPoints = new IVec[zShift.length][zShift[0].length][zShift[0][0].length]; // initialize contents with IVec for(int i=0; i < controlPoints.length; i++){ for(int j=0; j < controlPoints[i].length; j++){ for(int k=0; k < controlPoints[i][j].length; k++){ controlPoints[i][j][k] = new IVec(i*10,j*10,k*10 + zShift[i][j][k]); } } } IPoint[][][] points = new IPoint[controlPoints.length][controlPoints[0].length][controlPoints[0][0].length]; // initialize contents with IPoint for(int i=0; i < points.length; i++){ for(int j=0; j < points[i].length; j++){ for(int k=0; k < points[i][j].length; k++){ points[i][j][k] = new IPoint(controlPoints[i][j][k]) .clr(i*0.1,j*0.1,k*0.1); } } }
3次元配列の構造を図で確認します。
2次元配列と同様に、最内側の配列の長さには外側の配列と中側の配列の要素番号に加えて
lengthフィールドから参照します("M[i][j].length")。