最終更新: llysfactoryll 2013年06月18日(火) 22:28:50履歴
<<ノーム・メトロにするためには
人間がとるテンポだから、当然毎回ばらばらと変化して、読みづらい。
そこで、何回か平均を取ると、少しはましになるだろうか。
一般にプログラミング言語は、戻り値には、ひとつしか返せない場合が多い。
二つ目の戻り値が欲しければ、引数にポインタで渡すだとか、参照を渡すだとかする。
しかしJavaは、それらが、あまりうまくいかない。
Javaでは、基本型は値渡し、クラスは参照渡しということであり、「int」をラップしたクラス「Integer」があるが、これを引数に渡しても、うまくいかない。
それは「Integer」クラスの、中の値を更新する手段が無いからである。
大概の操作は、新しいオブジェクトが生成されて、引数で渡されたオブジェクトを押しのけて、新しいオブジェクトに変わるだけで、元々のオブジェクトの、中の値は変わらない。
そこで用いられる、かっこ悪いテクニックは、このように、単独の変数でも、配列として渡す方法である。
人間がとるテンポだから、当然毎回ばらばらと変化して、読みづらい。
そこで、何回か平均を取ると、少しはましになるだろうか。
public class nomeMetro { protected static final int N_AVERAGE = 10; protected long[] __intervals = new long[N_AVERAGE]; protected int __index = 0; protected int __count = 0; protected long average(long interval) { if( __index >= N_AVERAGE ) { __index = 0; } __intervals[__index++] = interval; if( __count < N_AVERAGE ) { ++__count; } long sum = 0; int i; for( i=0; i<__count; ++i ) { sum += __intervals[i]; } return Math.round( (double)sum / (double)__count ); } public int Action(long time, int[] average) { long interval = time - __last_time; __last_time = time; average[0] = tempo( average(interval) ); return tempo(interval); } }
一般にプログラミング言語は、戻り値には、ひとつしか返せない場合が多い。
二つ目の戻り値が欲しければ、引数にポインタで渡すだとか、参照を渡すだとかする。
しかしJavaは、それらが、あまりうまくいかない。
Javaでは、基本型は値渡し、クラスは参照渡しということであり、「int」をラップしたクラス「Integer」があるが、これを引数に渡しても、うまくいかない。
それは「Integer」クラスの、中の値を更新する手段が無いからである。
大概の操作は、新しいオブジェクトが生成されて、引数で渡されたオブジェクトを押しのけて、新しいオブジェクトに変わるだけで、元々のオブジェクトの、中の値は変わらない。
そこで用いられる、かっこ悪いテクニックは、このように、単独の変数でも、配列として渡す方法である。
public class MainActivity extends Activity { protected void onDown(MotionEvent event) { int[] average = new int[1]; int tempo = __nomeMetro.Action(event.getEventTime(), average); tempoAverage.setText(String.valueOf(average[0])); tempoNow.setText(String.valueOf(tempo)); } }
平均をリセット>>
コメントをかく