ページ 1 / 1
引数に関数を入れる方法
Posted: 2010年11月06日(土) 10:45
by red
引数に関数を入れる方法等はないでしょうか?
とある関数でwhile文を使っているのですがこれが原因で処理が止まってしまいます。(3秒くらい)
このwhile中にも行いたい処理があるのですがこういうのは無理なのでしょうか?
たとえば下記のような関数があるとします。
int returnNum( int num, int max );
int returnNum( int num, int max ){
int r = rand()%max;
while(r=num){
r = rand()%max
}
return r;
}
この関数は最大値maxの範囲内でnumとかぶらない数字を返す関数です。
ほぼあり得ないのですがこのrが60回同じ値を出力(whileが回ってしまう)してしまったら
1秒処理が止まってしまうと思います。 ※止まらないかもしれません・・・。
このwhile中にも処理を入れたいので引数に関数を指定できるようにしたいです。
Re:引数に関数を入れる方法
Posted: 2010年11月06日(土) 11:11
by ココナ
何故1秒間に何億回も計算が出来るCPUで、60回乱数を計算するだけで1秒もかかると思います?
また、短い関数なのにrの代入が2か所にあるのも気になります。
do while();
を使いましょう。
更に、whileの条件式がおかしいと思いますが、期待する動作をしますか?
Re:引数に関数を入れる方法
Posted: 2010年11月06日(土) 11:45
by toyo
これはnumに0渡すと3秒どころか無限ループしますね
C言語の比較は=ではなくて==と2個です
ところでwhileの中というのは
while (この部分){ }のことでしょうか
この部分であれば関数は普通に使えますよ
ちなみにwhile( )は関数ではなく制御構文といいます
自分が作るなら
int r = rand()%(max - 1);
if (r == num)
{
r++;
}
にします
Re:引数に関数を入れる方法
Posted: 2010年11月06日(土) 11:48
by toyo
0を渡すとじゃなくて0以外を渡すとですね
コードも訂正
int r = rand()%(max - 1);
if (r >= num)
{
r++;
}

Re:引数に関数を入れる方法
Posted: 2010年11月06日(土) 12:53
by box
「引数に関数を入れる」と書かれてましたので、私はてっきり
>int returnNum( int num, int max ){
ここの引数の並び(numとmax)に加えて関数(へのポインタ)を
入れるとばかり思ってましたが、実際の話は全然違ってますね。
何がしたいのでしょうか?
Re:引数に関数を入れる方法
Posted: 2010年11月06日(土) 16:25
by ISLe
EZアプリ(BREW)で被らない値が出るまで乱数取得を繰り返すプログラムがウォッチドッグに掛かって端末リセットを発生させる現象に遭遇したことがあります。
コンバートしたiアプリがそうなってたのでtoyoさんが書かれているように最大値からあらかじめ抜けた分をひいて乱数を求めることにして対処しました。
Re:引数に関数を入れる方法
Posted: 2010年11月06日(土) 17:01
by アビゲイル
ひょっとするとreturnNumは説明上、用意した関数なのかな?
Re:引数に関数を入れる方法
Posted: 2010年11月06日(土) 18:18
by ISLe
> ひょっとするとreturnNumは説明上、用意した関数なのかな?
そうするとwhileブロックの中で関数を呼び出しても解決しない気がしますね。
マルチスレッド化してそのままのコードを使うか、switchやgotoを使ってコルーチン(もどき)に改造することになりますかね。
ループ一回あたりの処理時間が長いのかループを抜け出す条件の成立に時間がかかるのか、またかかる時間がいつも同じなのかどうか、ということが分かれば別の最適な方法を提示できるかもしれません。