中文偽春菜後援會論壇  

打印

[討論] AYA語法編程常見問題

AYA語法編程常見問題

AYA5的運行方式是比較接近C語言的,簡單易讀與不須使用諸多的頭文件是AYA5成為初學編程的同學試寫代碼的一大便利。以下是吾輩總結的使用AYA5編程中遇到的常見問題。
1.關於函數名加On和不加On及加Select的區別
同一函數,比如OnFunction、Function、及Select.Function。其中,OnFunction的使用範圍最高,你可以創建一個選項,比如"\q[函數,OnFunction,r1,r2,r3]",點擊這個選項,OnFunction函數即可運行,其中r1,r2,r3是參數,用來傳遞給OnFunction,其值分別對應reference0,reference1,reference2。對於Function,"\q[函數,Function,r1,r2,r3]"是不起作用的,它會自動尋找Select.Function的函數名並運行,如果沒有,便跳過。所以Select.Function的函數名才能使"\q[函數,Function,r1,r2,r3]"起作用。但是這裡有個問題,reference0,reference1,reference2並不對應r1,r2,r3,而是將Function這個名字作為reference0,所以在帶參數的選項裡調用的函數,應該使用加On的函數名,不帶參數的涵數,可以使用加Select.的函數名,注意S應大寫,"."不可省略

2.reference,_argc,_argv的關係
reference是使用者操作產生的返回,_argv是程序內部帶參數調用的返回,而_argc是程序內部調用的返回參數的個數。
比如在OnKeyPress函數內部調用一個Function,這時鍵盤輸入就被作為reference0傳遞給Function,Function內部再用reference0接收或賦值,如果調用的是Function(reference0),Function內部就用_argv[0]賦值,_argc就為1。

3.變量的賦初值,字符串與整形數字與浮點數字如何轉換?
經常遇到這樣一個問題,數字的自加變成字符的累加,這是由於字符串沒有轉換成整形數字,變量在接收返回值時,自動就轉換成為與返回值類型相同的數據,比如在上一個函數調用它的時候:"\q[函數,OnFunction,1,變量,%(變量),1.0,"1"]"。reference0為整形數字1;reference1為字符串"變量";reference2為名叫「變量」的變量的內容;reference3為浮點數字1.0,在與reference3作加減乘除的運算中,自動轉換成浮點,不過AYA支持的浮點位數有限,不能作高精度運算,僅能看作實數;reference4是字符「1」。用reference4賦值後作加減運算就會產生字符的累加,所以應使用TOINT(reference4)轉換成整型數字1。在變量1==變量2這個運算中,值得注意。

4.關於腳本的接續
AYA5是按行從左到右從上至下編譯腳本內容的,如果一行未完就跳至下一行,就會有錯誤提示;
"這是一個腳本,\w9\w9它是從左到右運行的
\w9\n這是下一句話"
這個出錯了,原因是接續不全,應該是"這是一個腳本,\w9\w9它是從左到右運行的/
\w9\n這是下一句話"
其中,/是接續符,表示下面的內容與之前的內容是連在一起的,這夠成完整的一行。

5.何時換行,何時加{}與不加{}
if a==b;a=1
這是一個完整的表達,它沒有換行,也沒有加{},因為分號;的應用使它後面的a=1變成關係式的一部分。
再來看
if a==b;a=1;b=2
關係式起作用的是哪一部分,答案是a=1,因為在不加{}的情況下,if 語句能識別一行的內容,由於分號把b=2變成a=1的下一行,因此b=2就不受if語句的約束,要使if起作用應該這樣if a==b;{a=1;b=2}
這個在if a==b;1;return中猶為注意,這樣寫不受條件式的約束腳本運行就結束了。

6.全局變量與區域變量的使用條件
a=1;_b=2。
在上式中,a為全局變量,_b為區域變量,全局變量在整個人格裡都起作用,而區域變量只在當前{}括號內部起作用。那麼,什麼時候用全局變量,什麼時候用區域變量呢?
涉汲到存儲永久性的內容用全局變量,如果只是在當前函數中作臨時的運算,就用區域變量。請看下例:
Function
{
for i=0;i<10;i++
    {
      for j=0;j<5;j++
           {
              if Function1
                 {1;return}

           }
    }
0;return
}

Function1
{
for i=0;i<5;i++
    {
      for j=0;j<5;j++
           {
              if a==b
                 {1;return}

           }
    }
0;return
}
這個調用運行必然死機,為什麼?
因為兩個函數使用了共同的變量i和j,在運行Function1的時候,i和j都變成5;而在調用Function1的Function內,只要i<10都要執行下一個循環,而i永運停留在5的數值,就造成了死循環,因而SSP必然死機。所以應該把i改成_i,j改成_j來避免這種情況。

7.關於泛用陣列
AYA和C語言不同,C語言支持多維數組,而且數組大小必須定義,AYA只支持一維陣列的調用與賦值,數組大小不用定義。那麼如何用AYA實現多維數組的效果呢?看下例:

a=IARRAY
for _i=0;_i<Numa;_i++
    {
     for _j=0;_j<Numb;_j++
             {
              a[_i*Numb+_j]=1

             }

    }
這個代碼實現了把Numa行,Numb列的數據賦值為1,a[_i*Numb+_j]中,Numb是列數,_i*Numb就是第_i+1行開始時在陣列a中的索引位置,_i*Numb+_j就是第_i+1行第_j+1列在陣列a中的索引位置。
明白了這點,在需要調用陣列數據的程式裡面,就方便了。

TOP

關於第1條,Select.Function並不是aya的基礎語法,只有“橘花”才是這樣用的。
在aya_sysex.dic裡定義了
OnChoiceSelect
{
        EVAL("Select.%(reference0)")
}
而其他人如:紺野芽芽美、茶兔&茶鹿......等都是直接在OnChoiceSelect裡判斷的。
所以,Select.作為編程總結就不太適合。
而像第2條的reference定義在aya_shiori3.dic裡,可視為標準配置,倒也就沒關係了。
皮格马利翁效应(Pygmalion Effect):只要有爱,伪春菜也能和人类一样.

TOP

回復 2# Pygmalion 的帖子

好吧,我是以橘花為參照寫的總結,如果以茶兔&茶鹿為參照的話,可能我就會按照Choice.Function來比較了,不過OnChoiceSelect這個函數的用法是一致的吧。所以我說盡量用OnFunction來寫函數。
還有其他問題沒,歡迎指正。

TOP



當前時區 GMT+8, 現在時間是 2018-8-15 01:42

Processed in 0.011165 second(s), 8 queries, Gzip enabled.

清除 Cookies - 聯繫我們 - 中文偽春菜後援會 - Archiver - WAP - TOP - 界面風格