わいずふぁくとりいがプログラムの話題をウィキします。

<<ノーム・メトロにするためには

平均を求める


 人間がとるテンポだから、当然毎回ばらばらと変化して、読みづらい。
 そこで、何回か平均を取ると、少しはましになるだろうか。

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));
	}
	
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

管理人/副管理人のみ編集できます