さて、ループや条件で使う作業用メモリ一つをとってみてもまさに苦悩の塊。
なにせ変数全てが、宣言した直後からソースコード上でグローバル。
そう、実行時を考えたグローバルメモリとはわけが違う。
宣言レベルでグローバルになります。
とはいえ、Cくらいしか触ったことの無いおぼっちゃんプログラマには例を見せましょう
// 掛け算プログラムの例
action times@( 0 )
{
int a;
int b;
int c;
c = a * b;
}
action main@( 0 )
{
a = 5;
b = 10;
Call( times );
Talk( "c = " + c ); // 出力として、 "c = 50"となる。
}
なんだこれ。
まぁ、すげーとしか言えない・・・これでも慣れるわけですよ。
落とし穴だらけの綾織ですが、基本の罠として用意されているのがコレです。
action hoge@( 0 )
{
int a = 10; // 初期化付き宣言
}
action main@( 0 )
{
Talk( "a=" + a );
}
さて・・・なんともaが前方にあるし、グローバルだからアクセスできるし、初期化してるじゃん。
実はコレ、「hogeが実行されないとa=10が実行されず、aは不定。
いわゆるテンポラリとか、プログラムで必要な一時領域です。
まぁ基本の罠として用意されてます。
action display@( 0 )
{
int i = 0;
int data[10];
while( i<10 )
{
Talk( "dat:" + data[i]);
i++;
}
}
action main@( 0 )
{
i = 0;
while( i<10 )
{
data[i] = i;
Call( Display );
}
}
まぁ、これを見てすぐにつらさが理解できない人は綾織れません。
ここで重要なのは、Importしたファイル全てにこの罠が潜むということです。
ざっくりと今までの変数にたいする概念を切り捨てて、綾織について考えれば答えは出ています。
全てあきらめてグローバルとして一括管理するしかないことに。
要するにこんな感じです。
// 変数管理ファイル(variable.aya)
action variableInitialize@( 0 )
{
// デバッグ用に
int a = 0;
int b = 0;
int c = 0;
int i = 0;
int j = 0;
int k = 0;
int tmp = 0;
int temp = 0;
・
・
・
}
// mainファイル(main.aya)
#import "variable.aya"
action main@( 0 )
{
Call( variableInitialize );
}
とりあえず初期化忘れが無いのと、諦めて気が楽。