【VC++】汎用ポインタ(void *)を使ってユーザ定義型を渡してみる

0

    <機能>
    (1)とある会社の有料会員名簿、無料会員名簿から指定の支店の会員数を取得します
    (2)有料会員のデータ格納構造体、無料会員のデータ格納構造体を同じ関数に汎用ポインタを使って渡します
    (3)強引に汎用ポインタを使っています(こんな状況が業務であるかどうかわかりません)

    <サンプルデータ>
    有料会員名簿の要素数は4(会員コード、姓、名、支店名)
    無料会員名簿の要素数は2(会員コード、支店名)

    <イメージ>
    実行結果イメージ
    結果メッセージ出力、汎用ポインタ、void*、VC

    実行時に有料会員の会員コードの下3桁を出力ウィンドウに表示します
    おまけのポインタ加算、汎用ポインタ、void*、VC

     

    <その他(汎用ポンタは加減算できないことの確認)>
    おまけソースでポインタの加算処理サンプルを入れました(62〜69行)
    汎用ポインタはポインタの加減算ができませんがキャストすると通常のポインタと同じように加減算できます

     

    <使い方>
    1.MFCアプリケーションのコンソールベースでプロジェクトを作成
    2.構成プロパティ > 全般 > 文字セット で「マルチバイト文字セットを使用する」を選択

    マルチバイト文字セットを使用する、汎用ポインタ、void*、VC

     

    3.ヘッダファイルに構造体定義とデータセット処理(83行目以降)を貼り付ける
    4.ChechBranch関数をCPPファイルに張り付ける(43〜81行目)
    5.ChechBranch関数のプロトタイプ宣言をする(1〜3行目)
    6.Main関数からの呼び出し部を張り付ける(5〜41行目)


    //プロトタイプ宣言

    int ChechBranch(void *user, int sz, CString cs);
    //Main関数からChechBranchを呼び出し
    int main()
    {
        //〜〜省略〜〜
        //汎用ポインタにレコードを渡して"新宿支店"の合計会員数を取得します
        CString csBranch = "新宿支店";
        int idx, iTotal = 0,wkrtn;
        //有料会員の中で新宿支店の人数を取得
        idx = 0;
        while (1) {
            //終了判定("END"が出現したら終了)
            if ((wkrtn = strcmp(yuryo[idx].code, "END")) == 0) break;
            //新宿支店であればトータル数にカウント
            iTotal += ChechBranch(&yuryo[idx], sizeof(SCT_YURYO), csBranch);
            idx++;
        }
        //無料会員の中で新宿支店の人数を取得
        idx = 0;
        while (1) {
            //終了判定("END"が出現したら終了)
            if ((wkrtn = strcmp(muryo[idx].code, "END")) == 0) break;
            //新宿支店であればトータル数にカウント
            iTotal += ChechBranch(&muryo[idx], sizeof(SCT_MURYO), csBranch);
            idx++;
        }
        //結果をメッセージ出力する
        CString csMsg;
        csMsg.Format("%sの会員数(有料・無料とも)は%d名です", csBranch, iTotal);
        MessageBox(NULL, csMsg, "会員数取得", MB_ICONINFORMATION);
        //〜〜省略〜〜
    }

     

    /**************************************************************
    指定の支店に所属するか判定します
    パラメータ:user(有料、無料会員の1レコードを汎用ポインタで受け取る)
              :sz(レコードサイズ)
              :cs(対象の支店名)
    戻り値  :0(支店が不一致)、1(支店が一致)
    **************************************************************/

    int ChechBranch(void *user, int sz, CString cs)
    {
        SCT_YURYO *wkyuryo = NULL;
        SCT_MURYO *wkmuryo = NULL;
        CString cwk;

     

     

        //汎用ポンタ(void*)はキャストしてから参照する必要がある
        if (sz == sizeof(SCT_YURYO))
        {
            wkyuryo = (SCT_YURYO*)user;
            cwk = wkyuryo->branch;

     

            //(お遊びコード ポインタの加算)------START
            char *p1 = wkyuryo->code;
            char *p2 = NULL;
            p2 = p1 + 4;
            TRACE("有料会員番号の下3桁は%sです¥r¥n", p2);
            //汎用ポインタ(void*)は加減算できない(エラーとなります)
            //char *p3 = user + 4;
            //(お遊びコード ポインタの加算)------END

        }
        else if (sz == sizeof(SCT_MURYO))
        {
            wkmuryo = (SCT_MURYO*)user;
            cwk = wkmuryo->branch;
        }

     

        //指定の支店データか判定
        if (cwk == cs) return (1);

     

        return (0);
    }

     

    //ヘッダファイルに構造体の宣言とデータセット処理を張り付ける
    //有料会員
    //会員コード・姓・名・支店名

    struct SCT_YURYO{
        char *code;
        char *sei;
        char *mei;
        char *branch;
    };
    //有料会員テストデータをセット
    SCT_YURYO yuryo[] = {
        { "Y000001","山田","太郎","新宿支店"},
        { "Y000002","鈴木","一郎","上野支店" },
        { "Y000003","佐藤","花子","新宿支店" },
        { "Y000004","斉藤","洋子","池袋支店" },
        { "Y000005","山本","和男","上野支店" },
        { "Y000006","川崎","ひとみ","品川支店" },
        { "Y000007","大森","幸太郎","神田支店" },
        { "Y000008","佐藤","たけし","新宿支店" },
        { "Y000009","森","幸一","池袋支店" },
        { "Y000010","西山","春子","新宿支店" },
        { "Y000011","川越","進","品川支店" },
        { "END" },
    };

     

     

    //無料(無記名)会員
    //会員コード・支店名

    struct SCT_MURYO{
        char *code;
        char *branch;
    };
    //無料会員テストデータをセット
    SCT_MURYO muryo[] = {
        { "M000001","上野支店"},
        { "M000002","新宿支店" },
        { "M000003","新宿支店" },
        { "M000004","神田支店" },
        { "M000005","池袋支店" },
        { "M000006","新宿支店" },
        { "M000007","品川支店" },
        { "M000008","上野支店" },
        { "M000009","池袋支店" },
        { "M000010","新宿支店" },
        { "END","" },
    };

     

     

    よろしければポチッと押してください

    プログラマー ブログランキングへ



    selected entries

    categories

    calendar

    S M T W T F S
         12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31      
    << March 2024 >>

    profile

    others

    archives