● 関数リファレンス
変数の列挙
int __stdcall StrCalc_enumerate_param(PSTRCALC_PARAM prm,EP_CALLBACK func,void *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);
}