● 関数リファレンス

変数の列挙

    int __stdcall   StrCalc_enumerate_param(PSTRCALC_PARAM prm,EP_CALLBACK func,void *param);

引数

引数名意味
prmSTRCALC_PARAM 構造体の実体アドレス
func変数を発見した時に呼び出されるコールバック関数EP_CALLBACK のアドレス
param追加パラメータ

戻り値

正常終了した時は 1 を返します。
検索を中断した場合は、コールバックが返した値を返します。

説明

変数環境内にある全ての変数を列挙します。

例.変数を纏めてコピー

#include <stdio.h>
#include "sc39.h"

/* 表示用コールバック */
int __stdcall       prnproc(PPARAM_INFO pinf,void *dummy)
{
    printf("%s   ",pinf->name);

    switch(pinf->type){
        case    PRM_SINGLE:
                printf("単一   ");
                break;

        case    PRM_DIM1:
                printf("一次元配列   (%d)   ",pinf->width);
                break;

        case    PRM_DIM2:
                printf("二次元配列   (%d,%d)   ",pinf->width,pinf->height);
                break;

        /*
          StrCalc_enumerate_param は PRM_SINGLE 、PRM_DIM1 、PRM_DIM2 の時だけコールバックを呼び出す
          ので、default に来る事はありません。
        */
        default: /* ここでは念のため入れています */
                printf("不明   ");
    }

    printf("temp属性%s\n",(pinf->btempflg)? "あり" : "なし");

    return 1;
}

/* コピー用コールバック */
int __stdcall       copyproc(PPARAM_INFO pinf,PSTRCALC_PARAM pdest)
{
    PARAM_INFO      inf;
    int             ret;

    /* pdest に同名の変数が無いかチェックする */
    if ((ret =  StrCalc_search_param(pdest,pinf->name,&inf)) != 0){
        /* 同名の変数があった場合は、その変数を削除する */
        if ((ret = StrCalc_delete_param(pdest,pinf->name)) <= 0)
            return ret;
    }
    return StrCalc_new_param(pdest,pinf); /* 変数の登録 */
}

PARAM_INFO      prmtbl[] = {
    { "param1", PRM_SINGLE, NULL, 0, 0, 0 },
    { "param2", PRM_SINGLE, NULL, 0, 0, 1 },
    { "param3", PRM_DIM1, NULL, 10, 0, 0 },
    { "param4", PRM_DIM2, NULL, 20, 3, 0 }
};

void        main(void)
{
    STRCALC_PARAM       prm1,prm2;
    PPARAM_INFO         ptbl;
    int                 i;

    /* StrCalc 環境の初期化 */

    if (!StrCalc_init(&prm1)){
        printf("init err1.\n");
        return;
    }
    if (!StrCalc_init(&prm2)){
        printf("init err2.\n");
        StrCalc_term(&prm1);
        return;
    }

    /* prm1 に変数を登録する */
    ptbl = prmtbl;
    for(i = 0;i < sizeof(prmtbl) / sizeof(PARAM_INFO);i++,ptbl++){
        if (StrCalc_new_param(&prm1,ptbl) <= 0){
            printf("%s の登録に失敗\n",ptbl->name);
            StrCalc_term(&prm1); StrCalc_term(&prm2);
            return;
        }
    }

    printf("\n*********************************************************\n");

    /* 登録した変数の内容を確認 */
    if (StrCalc_enumerate_param(&prm1,(EP_CALLBACK)prnproc,0) <= 0){
        printf("StrCalc_enumerate_param の中断1\n");
        StrCalc_term(&prm1); StrCalc_term(&prm2);
        return;
    }

    /* prm1 の変数を prm2 にコピーする */
    if (StrCalc_enumerate_param(&prm1,(EP_CALLBACK)copyproc,(void *)&prm2) <= 0){
        printf("StrCalc_enumerate_param の中断2\n");
        StrCalc_term(&prm1); StrCalc_term(&prm2);
        return;
    }

    printf("\n*********************************************************\n");

    /* コピーした変数の内容を確認 */
    if (StrCalc_enumerate_param(&prm2,(EP_CALLBACK)prnproc,0) <= 0)
        printf("StrCalc_enumerate_param の中断3\n");

    StrCalc_term(&prm1); StrCalc_term(&prm2);
}