自作のループ関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mrs
記事: 5
登録日時: 13年前

自作のループ関数

#1

投稿記事 by mrs » 13年前

こんにちは。

コード:

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

よろしくお願いします。
しゅみでげーむつくってます(しかしえがちめいてきにへたです)
■ばぐはおれをほんろうする。が、おれをそだててもくれている・・・のかもしれない。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 自作のループ関数

#2

投稿記事 by みけCAT » 13年前

マクロを使用するのがいい気がしますが、とりあえず関数で実装するとこんな感じになりました。

コード:

#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;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 自作のループ関数

#3

投稿記事 by みけCAT » 13年前

マクロにしたら求められた形でできました。
本当に自作関数が必要ですか?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; 
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mrs
記事: 5
登録日時: 13年前

Re: 自作のループ関数

#4

投稿記事 by mrs » 13年前

マクロの使い方ぜんぜん知りませんでしたが、これは便利ですね。
実装もうまくいきました。ありがとうございます!
しゅみでげーむつくってます(しかしえがちめいてきにへたです)
■ばぐはおれをほんろうする。が、おれをそだててもくれている・・・のかもしれない。

nil
記事: 428
登録日時: 13年前

Re: 自作のループ関数

#5

投稿記事 by nil » 13年前

ループが三重四重になるならば一度プログラムの組み方を考え直した方がいいです。

コード:

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回ですからね。
単純な動作のみを行うのでしたら問題はありませんがそうでないのならパフォーマンスに関わってきます。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 自作のループ関数

#6

投稿記事 by beatle » 13年前

// ソース
の部分に具体的に何が入るかがわかれば、それに依存する形で綺麗な書き方を提示することはできるかと思います。

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

閉鎖

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