● StrCalc の実装

2-1.変数の使用

StrCalc Ver 3.9 の変数には単一変数一次元配列変数二次元配列変数の三種類があります(計算式規則参照の事)。


変数を使用する場合は、次の手順を行う必要があります。

  1. 登録は、PARAM_INFO構造体 の実体に情報をセットし、関数StrCalc_new_param を呼び出します。

  2. 関数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_paramnamenametbl_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 を実行した後で行います。

テーブルには、変数名として使用する事を禁止する文字列をセットします。プログラム例の先頭側を上記のように変更すると、変数の登録が行えなくなるので、"変数の登録に失敗しました" というメッセージを表示してプログラムが中断します。