引数に関数を入れる方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
red

引数に関数を入れる方法

#1

投稿記事 by red » 14年前

引数に関数を入れる方法等はないでしょうか?
とある関数で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:引数に関数を入れる方法

#2

投稿記事 by ココナ » 14年前

何故1秒間に何億回も計算が出来るCPUで、60回乱数を計算するだけで1秒もかかると思います?
また、短い関数なのにrの代入が2か所にあるのも気になります。
do while();
を使いましょう。
更に、whileの条件式がおかしいと思いますが、期待する動作をしますか?

toyo

Re:引数に関数を入れる方法

#3

投稿記事 by toyo » 14年前

これはnumに0渡すと3秒どころか無限ループしますね
C言語の比較は=ではなくて==と2個です
ところでwhileの中というのは
while (この部分){ }のことでしょうか
この部分であれば関数は普通に使えますよ
ちなみにwhile( )は関数ではなく制御構文といいます
自分が作るなら
int r = rand()%(max - 1);
if (r == num)
{
r++;
}
にします

toyo

Re:引数に関数を入れる方法

#4

投稿記事 by toyo » 14年前

0を渡すとじゃなくて0以外を渡すとですね
コードも訂正
int r = rand()%(max - 1);
if (r >= num)
{
r++;
} 画像

box

Re:引数に関数を入れる方法

#5

投稿記事 by box » 14年前

「引数に関数を入れる」と書かれてましたので、私はてっきり

>int returnNum( int num, int max ){

ここの引数の並び(numとmax)に加えて関数(へのポインタ)を
入れるとばかり思ってましたが、実際の話は全然違ってますね。

何がしたいのでしょうか?

ISLe

Re:引数に関数を入れる方法

#6

投稿記事 by ISLe » 14年前

EZアプリ(BREW)で被らない値が出るまで乱数取得を繰り返すプログラムがウォッチドッグに掛かって端末リセットを発生させる現象に遭遇したことがあります。
コンバートしたiアプリがそうなってたのでtoyoさんが書かれているように最大値からあらかじめ抜けた分をひいて乱数を求めることにして対処しました。

アビゲイル

Re:引数に関数を入れる方法

#7

投稿記事 by アビゲイル » 14年前

ひょっとするとreturnNumは説明上、用意した関数なのかな?

ISLe

Re:引数に関数を入れる方法

#8

投稿記事 by ISLe » 14年前

> ひょっとするとreturnNumは説明上、用意した関数なのかな?

そうするとwhileブロックの中で関数を呼び出しても解決しない気がしますね。

マルチスレッド化してそのままのコードを使うか、switchやgotoを使ってコルーチン(もどき)に改造することになりますかね。

ループ一回あたりの処理時間が長いのかループを抜け出す条件の成立に時間がかかるのか、またかかる時間がいつも同じなのかどうか、ということが分かれば別の最適な方法を提示できるかもしれません。

閉鎖

“C言語何でも質問掲示板” へ戻る