Home > C
2009/04/13 [長年日記 ]

新入社員応援企画(その4)

《問題》
任意の型value1およびvalue2を入れ替える関数swap()を作成しなさい。
(続きを読む…)

2009/04/13 [長年日記 ]

新入社員応援企画(その3)

《問題》
以下の構造体PERSON型変数value1およびvalue2を入れ替える関数stswap()を作成しなさい。


typedef struct person {
        int     id;
        char    name[50];
} PERSON;

(続きを読む…)

2009/04/13 [長年日記 ]

新入社員応援企画(その2)

《問題》
文字列型変数value1およびvalue2の中身を入れ替える関数sswap()を作成しなさい。ただし、strcpy()、memcpy()などは使用しないこと。
(続きを読む…)

2009/04/13 [長年日記 ]

新入社員応援企画(その1)

《問題》
数値型の変数value1およびvalue2の中身を入れ替える関数nswap()を作成しなさい。

(続きを読む…)

2009/03/29 [長年日記 ]

関数ポインタを使ってみる

関数ポインタって、引数として変数ではなく関数を渡すもの。百聞は一見にしかずということで、前回使ったキュー&スタックに検索用の関数を追加する。

《que.h(追加分)》


int    que_search(
        const void *target, void **data,
        int (*search)(const void *src, const void *dst)
);

プロトタイプ宣言にque_search()を追加する。関数ポインタとしてsearch()を受取る。search()には、比較元のデータであるsrcと比較対象のデータであるdstが必要。

《que.c(追加分)》


int     que_search(const void *target, void **data, int (*search)(const void *src, const void *dst))
{
        QUE     *p = NULL;
        int     status;

        p = root.next;

        for(;;) {
                if (p == &root) {
                        return(1);
                }
                status = search(target, p->data);
                if (status == 0) {
                        *data = p->data;
                        free(p);
                        return(0);
                } else {
                        p = p->next;
                }
        }

        return (0);
}

変数targetと、QUEの中に格納されているdataの値を関数ポインタのsearch()に渡して、その結果が0である場合に、一致したとしてQUEの中にあるdataを返す。
ここで、重要なのがsearch()には、上にも書いた二つの引数以外に、戻り値としてsrcとdstが一致した場合には0、不一致の場合には0以外を返す必要がある。

《main.c》


#include  "que.h"

int     main(int argc, char **argv)
{
        int     status;
        char    *str = NULL;
        char    *src = NULL;

        status = que_enque("fuga");
        status = que_enque("hoge");
        status = que_enque("geho");
        status = que_enque("one");
        status = que_enque("two");
        status = que_enque("three");

        src = strdup("fuga");
        status = que_search (src, (void **)&str, datacmp);
        if (status) {
                fprintf(stderr, "%s is not found.\n", src);
        } else {
                puts(str);
        }
        exit(0);
}

int     datacmp(const void *src, const void *dst)
{
        int     status;

        status = strcmp(src, dst);

        return (status);
}

データ比較用関数として、datacmp()を作成。見たとおり内部でstrcmp()を呼んでいるだけなので、特に関数を作る必要はない。ただ、これを応用することによって、文字列以外のデータについても検索することができるようになる。

Next »