HP OpenVMS Systems Documentation |
| 前へ | 目次 | 索引 |
SCAN のウォッチポイントについては,次の点に注意してください。
次の各サブトピックでは,次の SCAN 変数の検査方法と,これらの変数への格納の方法について説明します。
STRING
FILL
POINTER
TREE
TREEPTR
RECORD
OVERLAY
FIXED STRING 変数に格納する場合,その変数の宣言で設定したサイズよりも長い文字列を格納すると,切り捨てが行われます。
VARYING STRING 変数に格納する場合,その変数の宣言で設定した最大長よりも長いサイズの文字列を格納すると,切り捨てが行われます。
DYNAMIC STRING 変数に格納する場合,その変数の現在のサイズよりも長い文字列を格納すると,切り捨てが行われます。
FIXED STRING 変数および DYNAMIC STRING 変数では,変数の現在のサイズよりも短い文字列を格納すると,その文字列は左寄せされ,埋められなかった部分の右側はブランク文字で埋められます。
VARYING STRING 変数の場合,変数を格納している現在の領域は,格納される変数に合わせてサイズが調節されます。
C.15.7.2 FILL 変数
省略時設定で FILL 変数の値を調べると,指定した変数の内容が文字列として表示されるので,それを見てもほとんど意味がないことがあります。フィルの特性または型が分かっているときは,適切な修飾子をコマンドに使用することによって,意味のある表示を行わせることができます。次の例は,フィルx が単精度浮動小数点数であると分かっているときのコマンドです。
DBG> EXAMINE/FLOAT x |
POINTER が指している変数のアドレスを検索するために,POINTER を名前でチェックすることができます。POINTER に基づく変数を検査するには,負符号と右不等号を組み合わせた演算子(-->) を使用してください。
次の宣言と代入が行われた場合について考えます。
TYPE symnode: RECORD
ptr: POINTER TO symnode,
vstr: VARYING STRING( 20 ),
END RECORD;
DECLARE x : symnode;
DECLARE xptr: POINTER TO symnode;
xptr = POINTER(x);
x.vstr = 'prehensile';
|
次のコマンドは,x の構成要素であるvstr の値を表示します。
DBG> EXAMINE x.vstr POINTER\MAINPOINTER\X.VSTR: 'prehensile' |
次のコマンドは,POINTER に基づいてvstr の値を表示します。
DBG> EXAMINE xptr->.vstr POINTER\MAINPOINTER\XPTR->.VSTR: 'prehensile ' |
次の構文を使用すると,木構造のノードの内容を調べることができます。
EXAMINE tree_variable([subscript],...) |
TREE 変数へ格納することはできません。
EXAMINE コマンドで木構造の名前を指定すると,その木構造のノードと葉の内容がすべて表示されます。次に例を示します。
DBG> EXAMINE voters |
下位ノードの指定は,そのノードの添字を入力すればできます。次に例を示します。
DBG> EXAMINE voters('salem')
|
確認したい葉につながる添字をすべて指定すると,木構造の葉ノードを調べることができます。次に例を示します。
DBG> EXAMINE voters('salem',ward2)
|
cityptr または wardptr などの TREEPTR 変数を調べると,その木ノードのアドレスが表示されます。 TREEPTR 変数が何を指しているかを次のようにして確認します。
DBG> EXAMINE cityptr-> |
C.15.7.5 RECORD 変数と OVERLAY 変数
EXAMINE コマンドを使用するときに RECORD を名前で指定すると, RECORD のすべての構成要素が表示されます。 RECORD の構成要素を個々に調べるには,各構成要素をフル・ネームで指定します。
一般的な書式は次のとおりです。
EXAMINE recordname |
EXAMINE recordname.componentname.componentname... |
OVERLAY の確認方法もこれと同様です。OVERLAY の場合も構成要素がすべて表示されます。このように,FILL(4),INTEGER,VARYING STRING(2) がそれぞれ 4 バイトの領域であれば,4 つのバイトは 3 種類の異なった形式で表示されます。
C.16 UNKNOWN言語
次の各サブトピックでは, UNKNOWN である言語の,デバッガのサポートについて説明します。
C.16.1 言語式の演算子
UNKNOWN の言語について,言語式でサポートされている演算子を次に示します。
| 種類 | シンボル | 機能 |
|---|---|---|
| 接頭辞 | + | 単項正符号 |
| 接頭辞 | - | 単項負符号 (否定) |
| 挿入辞 | + | 加算 |
| 挿入辞 | - | 減算 |
| 挿入辞 | * | 乗算 |
| 挿入辞 | / | 除算 |
| 挿入辞 | ** | べき乗(VAX 固有) |
| 挿入辞 | & | 連結 |
| 挿入辞 | // | 連結 |
| 挿入辞 | = | 等値 |
| 挿入辞 | <> | 不等 |
| 挿入辞 | /= | 不等 |
| 挿入辞 | > | 大なり |
| 挿入辞 | >= | 以上 |
| 挿入辞 | < | 小なり |
| 挿入辞 | <= | 以下 |
| 挿入辞 | EQL | 等値 |
| 挿入辞 | NEQ | 不等 |
| 挿入辞 | GTR | 大なり |
| 挿入辞 | GEQ | 以上 |
| 挿入辞 | LSS | 小なり |
| 挿入辞 | LEQ | 以下 |
| 接頭辞 | NOT | 論理否定 |
| 挿入辞 | AND | 論理積 |
| 挿入辞 | OR | 論理和 |
| 挿入辞 | XOR | 排他的論理和 |
| 挿入辞 | EQV | 同値 |
UNKNOWN の言語について,サポートされている言語式とアドレス式の構造を次に示します。
| シンボル | 構造 |
|---|---|
| [ ] | 添字指定 |
| ( ) | 添字指定 |
| .(ピリオド) | レコードの構成要素の選択 |
| ^(サーカンフレックス) | ポインタの間接参照 |
UNKNOWN の言語について,サポートされている定義済みのシンボルを次に示します。
| シンボル | 意味 |
|---|---|
| TRUE | 論理値 TRUE |
| FALSE | 論理値 FALSE |
| NIL | NIL ポインタ |
言語が UNKNOWN に設定されている場合,デバッガは,他の言語で受け入れられるデータ型をすべて認識しますが,ピクチャ型やファイル型など,限られたいくつかの言語固有のデータ型は認識しません。 UNKNOWN の言語式では,OpenVMS 呼び出し規則のスカラ・データ型のほとんどを使用することができます。
この付録では, 第 8 章 , 第 9 章 ,および 第 10 章 の各章にある多くの図で使用されるプログラムのソース・コード,EIGHTQUEENS.Cおよび8QUEENS.Cを示します。ここで示すプログラムは,上記の各章で説明されているプロシージャを理解するためだけのものです。
D.1 EIGHTQUEENS.C
例 D-1 に,EIGHTQUEENS.Cを示します。これは, eightqueensの問題を解決するための,シングル・モジュール構成のプログラムです。
| 例 D-1 シングル・モジュール構成のプログラムEIGHTQUEENS.C |
|---|
extern void setqueen();
extern void removequeen();
extern void trycol();
extern void print();
int a[8]; /* a : array[1..8] of boolean */
int b[16]; /* b : array[2..16] of boolean */
int c[15]; /* c : array[-7..7] of boolean */
int x[8];
/* Solve eight-queens problem */
main()
{
int i;
for (i=0; i <=7; i++)
a[i] = 1;
for (i=0; i <=15; i++)
b[i] = 1;
for (i=0; i <=14; i++)
c[i] = 1;
trycol( 0 );
} /* End main */
void trycol( j )
int j;
{
int m;
int safe;
m = -1;
while (m++ < 7)
{
safe = (a[m] ==1) && (b[m + j] == 1) && (c[m - j + 7] ==1);
if (safe)
{
setqueen(m, j);
x[j] = m + 1;
if (j < 7)
trycol(j + 1);
else
print();
removequeen(m, j);
}
}
} /* End trycol */
void setqueen(m, j)
int m;
int j;
{
a[m] = 0;
b[m + j] = 0;
c[m - j + 7] = 0;
} /* End setqueen */
void removequeen(m, j)
int m;
int j;
{
a[m] = 1;
b[m + j] = 1;
c[m - j + 7] = 1;
} /* End removequeen */
void print()
{
int k;
for (k=0; k<=7; k++)
{
printf(" %d", x[k]);
}
printf("\n");
} /* End print */
|
D.2 8QUEENS.C
8QUEENS.Cは,eightqueensの問題を解決するためのマルチ・モジュール構成のプログラムです。このプログラムは,8QUEENS.C ( 例 D-2 ) および8QUEENS_SUB.C ( 例 D-3 )の 2つのモジュールから構成されます。
| 例 D-2 8QUEENS.Cのメイン・モジュール |
|---|
extern void trycol();
int a[8]; /* a : array[1..8] of boolean */
int b[16]; /* b : array[2..16] of boolean */
int c[15]; /* c : array[-7..7] of boolean */
int x[8];
main() /* Solve eight-queens problem */
{
int i;
for (i=0; i <=7; i++)
a[i] = 1;
for (i=0; i <=15; i++)
b[i] = 1;
for (i=0; i <=14; i++)
c[i] = 1;
trycol(0);
printf(" Solved eight-queens problem!\n");
} /* End main */
|
| 例 D-3 8QUEENS_SUB.Cのサブ・モジュール |
|---|
extern int a[8];
extern int b[16];
extern int c[15];
extern void setqueen();
extern void removequeen();
extern void print();
int x[8];
void trycol( j )
int j;
{
int m;
int safe;
m = -1;
while (m++ < 7)
{
safe = (a[m] ==1) && (b[m + j] == 1) && (c[m - j + 7] ==1);
if (safe)
{
setqueen(m, j);
x[j] = m + 1;
if (j < 7)
trycol(j + 1);
else
print();
removequeen(m, j);
}
}
} /* End trycol */
void setqueen(m, j)
int m;
int j;
{
a[m] = 0;
b[m + j] = 0;
c[m - j + 7] = 0;
} /* End setqueen */
void removequeen(m, j)
int m;
int j;
{
a[m] = 1;
b[m + j] = 1;
c[m - j + 7] = 1;
} /* End removequeen */
void print()
{
int k;
for (k=0; k<=7; k++)
{
printf(" %d", x[k]);
}
printf("\n");
} /* End print */
|
| 前へ | 索引 | 目次 |