« | »

2009/04/13 [長年日記]

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

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

《解答例》
数値型でも文字列でも構造体でも入れ替えることができることができるようにするには、どうすればいいのか。
文字列を扱うことから、ポインタのポインタが必要なことはわかる。では、swap()に渡される値がどのような型になるのかは、想定できない。でも、C言語にはvoid*と言うのがある。
これは、どのような型かはわからないけれど、とりあえずなにかのポインタであると言うことがわかる型である。
実際に書くとこうなる。


#include        <stdio.h>
#include        <stdlib.h>
#include        <string.h>

int     swap(void **value1, void **value2)
{
        void *work = NULL;

        work = *value1;
        *value1 = *value2;
        *value2 = work;

        return(0);
}

まるで、文字列のときと同じように見える。と言うかchar**がvoid**に替わっただけ。これで、どのような方が来ても対応できるはず。
ただし、呼び出す側にはちょっと工夫が必要になってくる。


#include        <stdio.h>
#include        <stdlib.h>
#include        <string.h>

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

int     main(int argc, char *argv[])
{
        int     a = 100;
        int     b = 200;
        int     *pa = &a;
        int     *pb = &b;
        char    x[] = "abc";
        char    y[] = "xyz";
        char    *px = x;
        char    *py = y;
        PERSON  emp1;
        PERSON  emp2;
        PERSON  *pe1 = &emp1;
        PERSON  *pe2 = &emp2;

        swap((void **)&pa, (void **)&pb);
        swap((void **)&px, (void **)&py);
        swap((void **)&pe1, (void **)&pe2);

        exit (0);
}

swap()を呼び出す場合、引数がポインタのポインタになっているので、それにあわせる必要があるのと、void**なのでキャストをする必要がある。

Comment & Trackback

Comments and Trackback are closed.

No comments.