1時間ごとに更新!Amazon.co.jpで今売れている本トップ100   掲示板ランキング



掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6228

関数のテーブルからの呼び出し
投稿者---xXx(2006/07/26 14:31:12)


 はじめまして。初投稿ですが宜しくお願い致します。
さっそくですが、表題の通り関数をテーブルから呼び出す事について
ご教授お願い致します。具体的に説明しますと、数十個の関数が有る場合に、Switch-Caseやif文では大変見苦しいコーディングになってしまいます。
そのため、関数のポインタを格納したテーブルを作成し、それを用いて
条件にあった関数をCallするというシーケンスを作成したいのです。
宜しければ簡単なサンプルで宜しいので記述方法をご教授お願い致します。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数のテーブルからの呼び出し 6229 xXx 2006/07/26 14:35:56
<子記事> Re:関数のテーブルからの呼び出し 6230 nop 2006/07/26 14:40:36
<子記事> Re:関数のテーブルからの呼び出し 6233 επιστημη 2006/07/26 15:01:14


No.6229

Re:関数のテーブルからの呼び出し
投稿者---xXx(2006/07/26 14:35:56)


申し訳ありません。環境はWinWP、VC++6.0でCのみで作成しております。


この投稿にコメントする

削除パスワード

No.6230

Re:関数のテーブルからの呼び出し
投稿者---nop(2006/07/26 14:40:36)


具体的に、何がわからないのですか?
ご自分ではどこまで出来たのですか?


この投稿にコメントする

削除パスワード

No.6234

Re:関数のテーブルからの呼び出し
投稿者---xXx(2006/07/26 15:01:15)


>具体的に、何がわからないのですか?
>ご自分ではどこまで出来たのですか?

#include<stdio.h>

void a(void);
void b(void);
void c(void);

/* a,b,cの関数のポインタを格納した配列 */
int main()
{
    int funcNo;
    
    printf("使用する関数は:\n");
    scanf("%d",&funcNo);
    
/* 入力されたNoに応じてa,b,cの関数呼び出し(配列から) */

    return 0;

}

void a(void)
{}
void b(void)
{}
void c(void)
{}


↑のようなイメージで作りたいのですが、配列の型、呼び出し方が分かりません。ご教授お願いできませんでしょうか?


この投稿にコメントする

削除パスワード

No.6235

Re:関数のテーブルからの呼び出し
投稿者---Blue(2006/07/26 15:07:41)


過去ログ
「関数ポインタについて」
http://f4.aaa.livedoor.jp/~pointc/No.25338.html
参考になると思います。



この投稿にコメントする

削除パスワード

No.6238

Re:関数のテーブルからの呼び出し
投稿者---xXx(2006/07/26 15:13:35)


>過去ログ
>「関数ポインタについて」
>http://f4.aaa.livedoor.jp/~pointc/No.25338.html
>参考になると思います。

べんきょうしてきます。


この投稿にコメントする

削除パスワード

No.6233

Re:関数のテーブルからの呼び出し
投稿者---επιστημη(2006/07/26 15:01:14)


>そのため、関数のポインタを格納したテーブルを作成し、それを用いて
>条件にあった関数をCallするというシーケンスを作成したいのです。

(テーブルでない)ひとつの関数ポインタを宣言し/設定し/呼び出すことはできますか?




この投稿にコメントする

削除パスワード

No.6236

Re:関数のテーブルからの呼び出し
投稿者---xXx(2006/07/26 15:07:59)


>(テーブルでない)ひとつの関数ポインタを宣言し/設定し/呼び出すことはできますか?


#include<stdio.h>

void a(void);

void (*func)(void) = a;
int main()
{
    a;
    return 0;

}

void a(void)
{
    printf("abc\n");
}


こんな感じでしょうか?


この投稿にコメントする

削除パスワード

No.6240

Re:関数のテーブルからの呼び出し
投稿者---ruby(2006/07/26 15:32:35)


>こんな感じでしょうか?

動作確認しましたか?
funcを使っていませんが…。


この投稿にコメントする

削除パスワード

No.6241

Re:関数のテーブルからの呼び出し
投稿者---nop(2006/07/26 15:34:37)


>こんな感じでしょうか?

と聞く前に、コンパイルし実行してみましたか?
人に聞くより、コンパイルしステップ実行を行えば、
望み通りのルートを通り、
望み通りの結果が得られているか、
と言うことは、すぐに判るはずです。


この投稿にコメントする

削除パスワード

No.6248

Re:関数のテーブルからの呼び出し
投稿者---επιστημη(2006/07/26 22:56:19)


>こんな感じでしょうか?

宣言できて設定できてるけど呼べてません。
これができるようになったら配列にすればできあがり。

関数ポインタ func_table[N] = { 関数その1, 関数その2, ... 関数そのN-1 };
int i = 関数に対応した番号;
func_table[i]を呼ぶ。



この投稿にコメントする

削除パスワード

No.6257

Re:関数のテーブルからの呼び出し
投稿者---円零(2006/07/28 18:37:38)


typedefを使う手もありますね。
typedefは記憶クラス指定子なので、staticやexternなどと同じ構文で書けます。
つまり、
typedef void(*FUNC)(void);

FUNC func[4];

のように書けば、引数をとらず値を返さない関数へのポインタ型にFUNCという名前がつけられ、
次にFUNC型の要素を4つ持つ配列funcが宣言されます。

これで初期化するなり後で代入するなりして、どこかで定義された関数のアドレスを格納すれば、
配列へのアクセスから関数を呼び出すことができるようになります。
その辺は
int i, j;
int *p[2] = {&i, &j};

のように宣言・初期化するのと一緒ですね。
ただし関数を表す識別子の場合、sizeof演算子またはアドレス演算子のオペランドである場合を除いて
その関数へのポインタに変換されると決められているので、&はつけてもつけなくても良いのですが。
同様に関数を呼び出すときも、(*func[0])()のように書く必要はありません。
別にそう書いても構いませんが、*func[0]で一旦型が関数になり、それが再びポインタ型に変換されて、
その上で関数呼び出し演算子()により関数呼び出しが行われることになります。


この投稿にコメントする

削除パスワード

No.6258

Re:関数のテーブルからの呼び出し
投稿者---ruby(2006/07/28 20:06:39)


>別にそう書いても構いませんが、*func[0]で一旦型が関数になり、それが再びポインタ型に変換されて、
>その上で関数呼び出し演算子()により関数呼び出しが行われることになります。

念のためにお聞きします。
これは、
    *func[0]();

としてもよい、という意味でしょうか?
だとするとそれは誤りで、
    (*func[0])();

と同値なのは
    func[0]();

です。
ご存じのことでしたら、申し訳ありません。


この投稿にコメントする

削除パスワード

No.6260

Re:関数のテーブルからの呼び出し
投稿者---円零(2006/07/29 00:23:01)


>    *func[0]();

>としてもよい、という意味でしょうか?

違います。
下二行は、「そう書いた」場合、つまり(*func[0])()のように書いた場合に行われる解釈を書いたものです。
*func[0]();と書いた場合のことは全く言及していません。

*func[0]がポインタ型に変換されると言うことは、func[0]に等しくなると言うことです。
つまり、(*func[0])()と(func[0])()が等しいことを指摘しています。


この投稿にコメントする

削除パスワード

No.6261

Re:関数のテーブルからの呼び出し
投稿者---ruby(2006/07/29 02:16:25)


私の読解力が足りないせいで、お手数をおかけいたしました。
申し訳ありません。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ