領域変数と基本的な関数
CSint型の変数は整数の領域変数です。定義済みのiZ-Cの関数では、CSintへのポインタ (CSint*)のみが使用されます。 領域変数はライブラリの管理下にあるため、作成した領域変数を利用者が解放することはできません。
コンストラクタ
CSint 型の領域変数は、以下の関数によって構築することができます。
-
CSint *cs_createCSint(int min, int max)
{ min .. max } を領域とするCSint 型変数を作成します。
-
CSint *cs_createNamedCSint(int min, int max, char *name)
{ min .. max } を領域とするCSint 型変数を作成し、名前をつけます。 (cs_createCSint() の後にcs_setName()を用いるのと同じです。)
-
CSint *CSINT(int n)
すでに即値化された(つまり、その領域の要素が1つしかない)CSint 型変数を作成するのに使います。 この関数は、cs_createCSint(n , n)と等価です。
-
CSint *cs_createCSintFromDomain(int *array, int size)
size の大きさをもつ array により定義される領域を持つCSint型変数を作成します。
-
CSint **cs_createCSintArray(int nbVars, int min, int max)
nbVars 個の CSint 型変数よりなる配列を作成します。各変数の領域は、すべて { min .. max }になります。
<注意> 本APIの返り値は領域変数の実装であるCSintへのポインタの配列です。 ポインタを格納した配列も制約処理系の管理下となるため、作成した配列を利用者が解放することはできません。
領域変数の情報にアクセスするための関数
CSint 型の領域変数に関する情報にアクセスするためには、以下の基本的な関数を使用します。
-
int cs_getMin(CSint *vint)
vint の領域の最小値を返します。
-
int cs_getMax(CSint *vint)
vint の領域の最大値を返します。
-
int cs_getNbElements(CSint *vint)
vint の領域に含まれる要素数を返します。
-
int cs_getNbConstraints(CSint *vint)
vint に設定されている制約の数を返します。設定されたときに失敗した制約は数に含まれません。
-
char *cs_getName(CSint *vint)
cs_setName()
を用いて vint に設定された名前を返します。CSint型の変数の名前は、
cs_printf()
やcs_fprintf()
でフォーマット記述子 %T を使った場合にも表示されます。
-
int cs_getNextValue(CSint *vint, int val)
vint の領域に含まれる値の集合の中で、val よりも大きい最初の要素を返します。
val が cs_getMax( vint ) で返る値より大きい場合には、本関数はINT_MAX (int 型の最大値)を返します。
以下の例では、cs_getNextValue() は for 文中で使われています。:
void display(CSint *vint) { int val; for (val = cs_getMin(vint); val <= cs_getMax(vint); val = cs_getNextValue(vint, val)) printf("%d ", val); }
上記の関数 display() は CSint 型の変数のとりうる値(=領域に含まれる値)をすべて、標準出力に昇順に出力します。
-
int cs_getPreviousValue(CSint *vint, int val)
vint の領域に含まれる値の集合の中で、val よりも小さい最初の要素を返します。
val が cs_getMin( vint ) で返る値より小さい場合には、本関数はINT_MIN (int 型の最小値)を返します。
-
int *cs_getDomain(CSint *vint)
vint の領域の要素を長さcs_getNbElements(vint) の配列の各要素の値として返します。 返された配列のメモリは不要になったら cs_freeDomain で解放する必要があります。
-
void cs_freeDomain(int *array)
cs_getDomain()
で取得した配列のメモリを解放します。
-
IZBOOL cs_isIn(CSint *vint, int val)
val が vint の領域の要素であれば TRUE を返します。そうでなければ FALSE を返します。
-
void cs_setName(CSint *vint, char *name)
CSint型変数に名前を付けるために使います。 CSint型変数が表示されるとき(
cs_printf()
あるいはcs_fprintf()
を使用します)、 付けられた名前も一緒に表示されます。(書式指定子 %T が指定された場合)
-
IZBOOL cs_isFree(CSint *vint)
vint がまだ即値化されていなければ TRUE を返します。 そうでなければFALSEを返します。
「即値かされていない」とはすなわち、cs_getNbElements( vint ) > 1 あるいは cs_getMin( vint ) < cs_getMax( vint ) であるような状態です。
-
IZBOOL cs_isInstantiated(CSint *vint)
vint が即値化されていれば TRUEを返します 。そうでなければFALSEを返します。
「即値かされている」とはすなわち、cs_getNbElements( vint ) == 1 あるいは cs_getMin( vint ) == cs_getMax( vint ) であるような状態です。
-
int cs_getValue(CSint *vint)
CSint 変数 vint が即値化されていれば、その値を返します。vint がまだ即値化されていない場合にはエラーが発生し (cs_getErr()を呼び出すとCS_ERR_GETVALUEが返ります。)、 cs_getValue( vint )は cs_getMin( vint )を返します。(デフォルトの動作の場合)
-
void cs_printf(const char *control, ...)
この関数は、CSint 型の変数およびCSint 型の変数の配列用の変換指定が3種類追加された以外は、C言語で標準のprintf()関数と同じです。
cs_printf("%T", vint)
は vint の名前を (名前があれば)表示し、ついでその領域を標準出力に出力します。cs_printf("%D", vint)
は vint の領域のみを標準出力に出力します。cs_printf("%A", array, size)
は size 個の要素よりなるCSint型変数の配列 array に含まれる各変数を表示します。もし名前があれば名前も表示します。変数間はコンマで区切られます。
-
void cs_fprintf(FILE *f, const char *control, ...)
この関数は引数として出力先のファイルを示すFILE ポインタ f をとる以外は cs_printf() と同じです。
領域に関する制約
以下の関数は制約であり、設定した時点でフェイルする(つまり、FALSE を返す)ことがあります。
-
IZBOOL cs_InArray(CSint *vint, int *array, int size)
CSint型変数 vint が長さ size の整数の配列 array に含まれる値を領域として持つように制約します。
-
IZBOOL cs_NotInArray(CSint *vint, int *array, int size)
CSint型変数 vint が array 配列に含まれる値を領域として持たないように制約します。 array に含まれるすべての値は vint の領域から取り除かれます。
これは以下のように定義できるでしょう。:
IZBOOL cs_notInArray(CSint *vint, int *array, int size) { int i; for (i = 0; i < size; i++) if (!cs_NEQ(vint, array[i]) return FALSE; return TRUE; }
-
IZBOOL cs_InInterval(CSint *vint, int min, int max)
CSint型変数 vint が{ min .. max }に含まれるような領域を持つように制約します。 (つまり cs_getMin( vint ) >= min かつ cs_getMax( vint ) <= max が成立する。)
これは以下のように定義できるでしょう。:
IZBOOL cs_InInterval(CSint *vint, int min, int max) { return(cs_GE(vint, min) && cs_LE(vint, max)); }
-
IZBOOL cs_NotInInterval(CSint *vint, int min, int max)
CSint 型変数 vint が区間{ min .. max }に含まれる値を領域として持たないように制約します。 vint の領域で区間{ min .. max }に含まれる値はすべて取り除かれます。
これは以下のように定義できるでしょう。:
IZBOOL cs_NotInInterval(CSint *vint, int min, int max) { int i; for (i = min; i <= max; i++) if (!cs_NEQ(vint, i)) return FALSE; return TRUE; }