掲示板利用宣言

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

 私は

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

掲示板2

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

No.30050

配列の要素に関数を指定することについて。
投稿者---hiro(2007/04/20 18:08:43)


配列の要素に関数名を指定できることを最近知ったのですが
使い方がよく分かっていないので、質問させてください。

質問の内容としては、以下3点です。

1.どのような動きをするのか。

2.どのような時に使うのか。
(データベースを利用する時に便利だという話を聞くのですが…。)

3.コンパイル時の配列の定義部で"移植性のないポインタ変換"という警告も気になります。


以下、プログラムです。


/* 配列の要素に関数を指定するプログラム */

#include <stdio.h>

/* プロトタイプ宣言 */
int plus(int, int);
int minus(int, int);

/* 配列の定義 */
int array_tbl[2] = {
    plus,
    minus
};

int main(void)
{
    printf("%d, %d\n", array_tbl[0], array_tbl[1]);

    printf("%d, %d\n", plus(300, 5), minus(5,3));
    plus(300,5);
    minus(5,3);

    printf("%d, %d\n", array_tbl[0], array_tbl[1]);


    return 0;
}


int plus(int a, int b) {
    return a+b;
}

int minus(int a, int b) {
    return a-b;
}





-------------------
開発環境
OS:WindowsXP
コンパイラ:bcc
-------------------

よろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列の要素に関数を指定することについて。 30051 bugs 2007/04/20 22:18:25


No.30051

Re:配列の要素に関数を指定することについて。
投稿者---bugs(2007/04/20 22:18:25)


hiroさんのコードに少し手を加えたサンプルです。
hiroさんのコードでは、array_tblは単なるint型の配列であって、
関数へのポインタになっていません。

/* 配列の要素に関数を指定するプログラム */

#include <stdio.h>

/* プロトタイプ宣言 */
int plus(int, int);
int minus(int, int);

/* 配列の定義 */
/* funcは「int型の引数を2個取り、int型を返す関数へのポインタ」を表わす */
typedef int (*func)(int, int);

func array_tbl[2] = {
    plus,
    minus
};

int main(void)
{
    int a, b, n;
    
    printf("計算に使う整数を2個入力してください > ");
    scanf("%d%d", &a, &b);
    
    do {
        printf("足し算:0, 引き算:1を入力してください > ");
        scanf("%d", &n);
    } while (n != 0 && n != 1);
    
    printf("%d%s%s%d%s=%d\n",
        a, (n == 0) ? "+" : "-", (b < 0) ? "(" : "", b, (b < 0) ? ")" : "",
        array_tbl[n](a, b));
    return 0;
}

int plus(int a, int b)
{
    return a + b;
}

int minus(int a, int b)
{
    return a - b;
}




この投稿にコメントする

削除パスワード

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