ユーザ言語プログラムで使用するデータ項目は、使用する前に定義する必要があります。3 種類の定義があります。
定数定義または変数定義のスコープは、それが定義された行から現在のブロックの最後まで、または定義がブロック外にある場合はユーザ言語プログラムの最後までです。
関数定義のスコープは、関数本体の閉じ中括弧(})からユーザ言語プログラムの最後までです。
定数は、次のようにキーワード列挙を使用して定義されます。
enum { a, b, c };
これは、3 つの定数 a、b、c を定義し、それぞれに値 0、1、2 を指定します。
定数は、次のように特定の値に初期化することもできます。
enum { a, b = 5, c };
a は 0、b は 5、c は 6 になります。
変数定義の一般的な構文は次のとおりです。
[numeric] type identifier [= initializer][, ...];
ここで、type はデータまたはオブジェクトのタイプの 1 つ、identifier は変数の名前、initializer はオプションの初期値です。
同じタイプの複数の変数定義は、カンマ(,)で区切ります。
識別子の後に括弧のペア([ ])が続く場合、これは指定された型の変数の配列を定義します。配列のサイズは、実行時に自動的に調整されます。
オプションのキーワード numeric を文字列配列と一緒に使用すると、sort() 関数を使用して英数字順に並べ替えることができます。
既定では(初期化子が存在しない場合)、データ変数は 0 (または文字列の場合は"")に設定され、オブジェクト変数は「無効」になります。
| int i; | i という名前の int 型変数を定義します |
| string s = "Hello"; | s という名前の string 型変数を定義し、"Hello" に初期化します |
| real a, b = 1.0, c; | a、b、c という名前の 3 つの real 型変数を定義し、b を値 1.0 に初期化します |
| int n[] = { 1, 2, 3 }; | 最初の 3 つの要素を 1、2、3 に初期化して、int 型配列を定義します |
| numeric string names[]; | 英数字順に並べ替えることができる string 型配列を定義します |
| UL_WIRE w; | w という名前の UL_WIRE オブジェクトを定義します |
| オブジェクト タイプの配列要素のメンバには、直接アクセスできません。 | |
| UL_SIGNAL signals[]; | |
| ... | |
| UL_SIGNAL s = signals[0]; | |
| printf("%s", s.name); |
ユーザ独自のユーザ言語関数を記述し、組み込み関数と同様に呼び出すことができます。関数定義の一般的な構文は次のとおりです。
type identifier(parameters)
{
statements
}ここで、type はデータまたはオブジェクトのタイプの 1 つ、identifier は関数の名前、parameters はカンマ区切りのパラメータ定義のリスト、statements は一連の文です。値を返さない関数のタイプは void になります。
関数は呼び出す前に定義する必要があります。関数呼び出しは、再帰的であってはなりません(その関数自体を呼び出すことはできません)。
関数本体の文でパラメータの値を変更することはできますが、関数呼び出しの引数に対しては何の効果もありません。
関数の実行は、return 文によって終了できます。return 文がない場合、関数本体は閉じ中括弧(})が出現するまで実行されます。
exit() 関数の呼び出しにより、ユーザ言語プログラム全体が終了します。
ユーザ言語プログラムに main() という関数が含まれている場合、その関数はメイン関数として明示的に呼び出され、その戻り値がプログラムの戻り値になります。
コマンド ライン引数は、グローバル組み込み変数 argc および argv を介してプログラムで使用できます。
int CountDots(string s)
{
int dots = 0;
for (int i = 0; s[i]; ++i)
if (s[i] == '.')
++dots;
return dots;
}
string dotted = "This.has.dots...";
output("test") {
printf("Number of dots: %d\n",
CountDots(dotted));
}