ページ 11

自作のループ関数

Posted: 2012年8月14日(火) 21:09
by mrs
こんにちは。

コード:

for(int i=0; i<5; i++){
	for(int j=0; j<10; j++){
	//ソース
	}
}
今作ってるソフトでは、上記のようなループ(5回ループと10回ループの組み合わせ)を何度も繰り返し利用したい、という状況が発生しています。
そして、さらにこれを更に以下のように多重ループとして用いる場合も多いので、しばしば非常に見難くなってしまっています。

コード:

for(int i=0; i<5; i++){
	for(int j=0; j<10; j++){
		for(int m=0; m<5; m++){
			for(int n=0; n<10; n++){
			//ソース
			}
		}
	}
}
そこで、この二重ループを関数か何かでまとめてコンパクトに処理したいと思っています。
解決策として今想定しているのは、以下のような状況です。
ここでLoopは自作関数(実装方法不明)であり、引数2個はループに使用する変数を表しています。

コード:

Loop(i,j){
	Loop(m,n){
	//ソース
	}
}
ここで本題の質問ですが、こういう自作関数を作ることは可能なのでしょうか?
可能であればぜひとも方法を教えて頂ければと思います。
もちろんコレ以外のやり方でも大丈夫です。見た目がコンパクトに出来ればそれで良いです。

よろしくお願いします。

Re: 自作のループ関数

Posted: 2012年8月14日(火) 21:29
by みけCAT
マクロを使用するのがいい気がしますが、とりあえず関数で実装するとこんな感じになりました。

コード:

#include <stdio.h>

typedef void(*loopFunc)(int i,int j);

void loop(int imin,int imax,int jmin,int jmax,loopFunc func) {
	int i,j;
	for(i=imin;i<imax;i++) {
		for(j=jmin;j<jmax;j++) {
			func(i,j);
		}
	}
}
int gi,gj;

void theFunc2(int m,int n) {
	//ソース 
	printf("i=%d,j=%d,m=%d,n=%d\n",gi,gj,m,n);
}

void theFunc(int i,int j) {
	gi=i;gj=j;
	loop(0,5,0,10,theFunc2);
}

int main(void) {
	loop(0,5,0,10,theFunc);
	return 0;
}

Re: 自作のループ関数

Posted: 2012年8月14日(火) 21:32
by みけCAT
マクロにしたら求められた形でできました。
本当に自作関数が必要ですか?C言語の文法では多分不可能だと思います。

コード:

#include <stdio.h>

#define Loop(a,b) for((a)=0;(a)<5;(a)++)for((b)=0;(b)<10;(b)++)

int main(void) {
	int i,j,m,n;
	Loop(i,j) {
		Loop(m,n) {
			//ソース
			printf("i=%d,j=%d,m=%d,n=%d\n",i,j,m,n);
		}
	}
	return 0; 
}

Re: 自作のループ関数

Posted: 2012年8月14日(火) 22:06
by mrs
マクロの使い方ぜんぜん知りませんでしたが、これは便利ですね。
実装もうまくいきました。ありがとうございます!

Re: 自作のループ関数

Posted: 2012年8月14日(火) 23:24
by nil
ループが三重四重になるならば一度プログラムの組み方を考え直した方がいいです。

コード:

for(int i=0; i<5; i++){
    for(int j=0; j<10; j++){
        for(int m=0; m<5; m++){
            for(int n=0; n<10; n++){
            //ソース
            }
        }
    }
}
これだけで内部で行われる処理は2500回ですからね。
単純な動作のみを行うのでしたら問題はありませんがそうでないのならパフォーマンスに関わってきます。

Re: 自作のループ関数

Posted: 2012年8月14日(火) 23:25
by beatle
// ソース
の部分に具体的に何が入るかがわかれば、それに依存する形で綺麗な書き方を提示することはできるかと思います。

// ソース
に何が入るか分からない段階ではみけCATさんのようにマクロを使う以外無いかもしれません。