● StrCalc の実装
2-1.変数の使用
StrCalc Ver 3.9 の変数には単一変数 、一次元配列変数 、二次元配列変数の三種類があります(計算式規則参照の事)。
変数を使用する場合は、次の手順を行う必要があります。
- 登録は、PARAM_INFO構造体 の実体に情報をセットし、関数StrCalc_new_param を呼び出します。
- 関数StrCalc_search_param により、登録した変数の情報を取得します。情報を得られれば、プログラムから変数を操作する事ができます。
例.
#include <stdio.h>
#include <string.h>
#include "sc39.h"
void main(void)
{
STRCALC_PARAM prm;
PARAM_INFO inf;
int ret;
if (!StrCalc_init(&prm)){
printf("メモリの確保に失敗しました\n");
return;
}
inf.type = PRM_SINGLE; /* 単一変数 */
strcpy(inf.name,"test_param"); /* 変数名 */
inf.btempflg = 0; /* テンポラリ属性無し */
/* 変数を作成登録し、その後で登録された変数の実体を検索します */
if (StrCalc_new_param(&prm,&inf) <= 0 ||
!StrCalc_search_param(&prm,"test_param",&inf)){
StrCalc_term(&prm);
printf("変数の登録に失敗しました\n");
return;
}
/* 変数の実体に値をセットします */
*inf.pval = 4.53; /* test_param = 4.53 */
/* 変数の内容を確認してみる */
prm.str = "test_param";
if ((ret = StrCalc(&prm)) != STATUS_NORMAL){
StrCalc_term(&prm);
printf("error. %d\n",ret);
return;
}
printf("test_param : %.16G\n",prm.ans);
/* 変数を計算で使用してみます */
prm.str = "sin(test_param)^2 + cos(test_param)^2";
ret = StrCalc(&prm);
StrCalc_term(&prm);
if (ret != STATUS_NORMAL)
printf("error. %d\n",ret);
else
printf("ans. : %.16G\n",prm.ans);
}
ソースファイル(zip)
上記の例は単一変数の場合ですが、一次元配列の場合は次のようになります。
inf.type ← PRM_DIM1
inf.name ← 変数名
inf.width ← 配列の全要素数
inf.btempflg ← 0
メンバ btempflg を 1 にするとテンポラリ属性が付加されますが、これは、後述の「変数の全削除」で意味を持ちます。ここでは 1 、0 、どちらにしてもかまいません。
計算式での変数の書式は "変数名( i )" となります。アプリケーションが変数へアクセスする場合は pval[ i 位置 ] で行う事ができます。
二次元配列の場合は次のようになります。
inf.type ← PRM_DIM2
inf.name ← 変数名
inf.width ← 配列の幅
inf.height ← 配列の高さ
inf.btempflg ← 0
計算式での変数の書式は "変数名( x , y )" となります。アプリケーションが変数へアクセスする場合は pval[ y 位置 × width + x 位置 ] で行う事ができます。
2-2.追加の変数チェック
STRCALC_PARAM 構造体 のメンバ ppcheck_paramname 、nametbl_cnt にテーブルの情報をセットすると、変数・関数・定数の登録時に追加の名前チェックが行われます。
テスト. 先のプログラム例の一部を変更
void main(void)
{
STRCALC_PARAM prm;
PARAM_INFO inf;
int ret;
static char *ptable[] = {
"test_param"
/* 必要なら、この後に禁止ワードを追加できます */
};
if (!StrCalc_init(&prm)){
printf("メモリの確保に失敗しました\n");
return;
}
prm.ppcheck_paramname = ptable;
prm.nametbl_cnt = sizeof(ptable) / sizeof(char *);
・
・
・
ソースファイル(zip)
テーブルのセットは、関数StrCalc_init を実行した後で行います。
テーブルには、変数名として使用する事を禁止する文字列をセットします。プログラム例の先頭側を上記のように変更すると、変数の登録が行えなくなるので、"変数の登録に失敗しました" というメッセージを表示してプログラムが中断します。