2006年12月18日更新
スタイル不使用
  スタイル使用
スペース

UWSCスクリプトの解説

ここは「UWSC」というソフトのスクリプトについての解説ページです。スクリプトなんてしたことない、ましてやプログラミングなんて別次元!って言う初心者の入門用に書こうとしました。ただパソコン初心者への説明は難しいのでしてません。ただし私はプログラミングやってますので説明不足があるかと思います。それに全て知ってるわけではないので説明できないところもあります。


目次


UWSCって?

UWSCとは何?というところから説明しましょうか。まずは作者さんのページにいってください。
うみうみ屋さん
説明読んでダウンロードしてください。使い方は2つほどあります。
1つは操作を記録して、後でそれを実行する。これは毎日する同じ操作を1回記録すれば、以降はスクリプト実行するだけでいいのでお茶を飲んでゆっくりできます。
2つ目はスクリプトを自分で書いてそれを実行することです。クリックばかりのゲームの能力アップを自動ですれば楽ですよ。
以降は2つ目のスクリプトを自分で書くことについて説明してます。


基本スクリプト

まずはスクリプトの作成方法。「ファイル名.uws」ってファイルを作ってください。"ファイル名"は"テスト"とか適当に決めてください。ここでは「基本.uws」を作ったとして話を進めます。基本.uwsをエディタで開いてください。メモ帳なら基本.uwsをドラッグ&ドロップして開けます。
ちなみに私はxyzzyってエディタを使ってます。xyzzy用のUWSCモードを作ったので公開しときます。(Ver4にちょっと対応)

uwsc-mode.lはsite-lispフォルダに、uwscはetcフォルダに入れてください。siteinit.lとかに以下の文を追加してください。
  1. ; UWSC
  2. (load-library "uwsc-mode")
  3. (push '("\\.uws$" . uwsc-mode) *auto-mode-alist*)
ファイル全体をインデントと関数一覧表示を追加しておくといいかな。私はC-F1とF12で登録してます。
  1. ; インデント
  2. (set-function-bar-label #\C-F1 "インデント")
  3. (global-set-key #\C-F1
  4.   #'(lambda ()
  5.     (interactive)
  6.     (indent-region (point-min) (point-max))))
  7. ; 関数一覧
  8. (set-function-bar-label #\F12 "関数一覧")
  9. (global-set-key #\F12 'list-function)
適当なつくりですが何もないよりまし程度にはなってます。
くにさんがUWSCの起動やヘルプを見れるように改良してくれました。
uwsc-mode.lの最初の方にある
  1. &(defvar *uwsc-command* "D:/util/operate/uwsc/UWSC.exe")
  2. (defvar *uwsc-help* "D:/util/operate/uwsc/uwsc.chm")
を自分の環境にあったように変更すると、C-c C-eで今開いてるファイルをUWSCで実行、F1でUWSCのヘルプが見れます。便利!

とりあえずスクリプティング基本.uwsを開いたら下記を記入

  1. //この行はコメントで無視されます
  2. MSGBOX("ようこそ!")
UWSCを起動して左端の「読込み」ボタンを押して基本.uwsを開く。真ん中の「再生」ボタンを押すとメッセージウィンドウが表示されます。「OK」ボタンを押すと終了します。1行目のように「//」を書くとそこから行の終わりまでコメントになります。
基本.uws


便利な変数

変数とはなんだろう?説明は難しいですね。そうですね〜入れ物と思ってください。ペットボトルにはお茶やジュースが入ります。容器は変えずに中身だけ替えることができます。とりあえずサンプル

  1. 変数 = 100
  2. ペットボトル = "お茶"
  3. MSGBOX("変数の中身は" + 変数 + "<#CR>" + "ペットボトルの中身は" + ペットボトル)
  4. 変数 = 200
  5. ペットボトル = "コーラ"
  6. MSGBOX("変数の中身は" + 変数 + "<#CR>" + "ペットボトルの中身は" + ペットボトル)
1行目は変数名「変数」に100を入れてます。2行目は変数名「ペットボトル」にお茶を入れてます。文字列(今回はお茶)を使うときはダブルクォーテーション「"」で囲みます。3行目は変数の中身を表示
4行目は変数名「変数」の中身を200に変更。5行目は変数名「ペットボトル」の中身をコーラに変更。6行目は3行目と同じく変数の中身を表示。
「=」は変数に中身を入れるという意味で使用します。通常の算数で使う「=」とは違うことを覚えてください。
変数1変数2

変数はスクリプト、プログラムの基本要素です。とりあえず使えるようになっときましょう。ちなみに変数にはスコープというのがあります。後で説明しますが、関数の使用に関係しています。


これがないとスクリプトじゃない!?制御構造

制御構造は非常に大事です。コレを理解してないと話しになりません。とりあえずサンプル

  1. Aさんのお金 = 100000
  2. Bさんのお金 = 1000
  3. MSGBOX("Aさんは金持ち?")
  4. if (Aさんのお金 > 10000) then MSGBOX("金持ちです") else MSGBOX("貧乏です")
  5. MSGBOX("Bさんは金持ち?")
  6. if (Bさんのお金 > 10000) then MSGBOX("金持ちです") else MSGBOX("貧乏です")
1、2行目は変数に代入。3、5行目は質問を表示。4、6行目が制御構造の1つです。お金が10000より多かったら金持ち、そうでないなら貧乏と表示するように場合分けしてます。制御構造とはこのように実行するスクリプトを自動で切り替えてくれるものです。
制御構造1制御構造2制御構造3制御構造4

制御構造にはいろいろなものがあります。それぞれ説明しましょう。
場合分けその1

  1. if (変数 > 0) then MSGBOX("大きい") else MSGBOX("小さい")
変数が0より大きい時「大きい」と表示して、それ以外のとき「小さい」と表示。日本語っぽくするなら
  1. もし (変数が 0 より大きいなら) コレ実行 MSGBOX("大きい") そうでないなら MSGBOX("小さい")

場合分けその2

  1. if (変数 > 0) then MSGBOX("大きい")
変数が0より大きい時「大きい」と表示して、それ以外のとき何もしない。

場合分けその3

  1. ifb (変数 > 0)
  2.  MSGBOX("大きい")
  3.  MSGBOX("でかいね")
  4. else
  5.  MSGBOX("小さい")
  6.  MSGBOX("チビだね")
  7. endif
変数が0より大きい時「大きい」と表示した後「でかいね」と表示して、それ以外のときは「小さい」と表示した後「チビだね」と表示。場合分けその1その2は場合分けの後は1つの命令しか実行できないが、これは複数の命令を実行できる。場合分けその1その2と同じ関係のelse以降を書かないバージョンもあります。また続けて場合分けする時には次のようにかけます。
  1. ifb (変数 > 10)
  2.  MSGBOX("とっても大きい")
  3. elseif (変数 > 0)
  4.  MSGBOX("大きい")
  5. else
  6.  MSGBOX("小さい")
  7. endif
コレは10より大きいと「とっても大きい」を表示し10以下で0より大きいと「大きい」と表示し、0以下の時は「小さい」と表示します。

指定回数繰り返す

  1. for (変数 = 1) to 5 step 1
  2.  MSGBOX(変数)
  3.  MSGBOX("ふ〜ん")
  4. next
変数に1を入れて2,3行目を実行。そのあと変数に1を足して再び2,3行目を実行。ふたたび変数に1を足して2、3行目を実行という風に繰り返して変数の値が5を超えたら終了。この場合「1」「ふ〜ん」「2」「ふ〜ん」「3」「ふ〜ん」「4」「ふ〜ん」「5」「ふ〜ん」と表示されます。通常はstep 1のところは省略できます。省略したら毎回変数に1を足します。毎回1づつ減っていくとか特別な場合にstep -1とかを書きます。日本語っぽくするなら
  1. 繰り返し (変数を 1 からはじめる) 5 まで繰り返す 毎回 1 を足す
  2.  MSGBOX(変数)
  3.  MSGBOX("ふ〜ん")
  4. 繰り返しに戻る

条件の間繰り返す

  1. 変数 = 5
  2. while (変数 > 0)
  3.  MSGBOX(変数)
  4.  変数 = 変数 - 1
  5. wend
1行目で変数を5に初期化。2行目〜5行目が制御構造です。変数が0より大きい間繰り返します。毎回変数の値を表示して、変数を1減らします。この場合「5」「4」「3」「2」「1」と表示します。日本語っぽくするなら
  1. 変数に 5 を入れる
  2. 次の間繰り返す (変数が 0 より大きい)
  3.  MSGBOX(変数)
  4.  変数を 1 減らす
  5. 繰り返しに戻る

条件まで繰り返す

  1. 変数 = 5
  2. repeat
  3.  MSGBOX(変数)
  4.  変数 = 変数 - 1
  5. until (変数 < 1)
1行目で変数を5に初期化。2行目〜5行目が制御構造です。変数が2より小さくなるまで繰り返します。毎回変数の値を表示して、変数を1減らします。この場合「5」「4」「3」「2」「1」と表示します。while〜wendは条件が正しければ繰り返し、repeat〜untilは条件になるまで(条件が正しくない間)繰り返します。条件を調べる場所が違うためwhile〜wendは1度も繰り返さない時があるが、repeat〜untilは最低でも1度は実行します。日本語っぽくするなら
  1. 変数に 5 を入れる
  2. 繰り返し
  3.  MSGBOX(変数)
  4.  変数を 1 減らす
  5. 次になるまで繰り返しに戻る (変数が 1 より小さい)

選択

  1. select (変数)
  2. case 0
  3.  MSGBOX("0です")
  4. case 1
  5.  MSGBOX("1です")
  6. case 2
  7.  MSGBOX("2です")
  8. default
  9.  MSGBOX("その他")
  10. selend
変数の内容によって場合分けします。0の時は「0です」、1の時は「1です」、2の時は「2です」、その他の時は「その他」と表示します。全ての場合をcaseで書いた場合は8,9行のdefaultは書かなくてもいいです。日本語っぽくするなら
  1. 選択しましょう (変数の値で場合分け)
  2. 0 の場合
  3.  MSGBOX("0です")
  4. 1 の場合
  5.  MSGBOX("1です")
  6. 2 の場合
  7.  MSGBOX("2です")
  8. 上記どれでもない場合
  9.  MSGBOX("その他")
  10. 選択終了

繰り返しの制御

  1. while (変数 > 0)
  2.  if (変数 > 10) then break
  3.  変数 = 変数 - 1
  4.  if (変数 > 5) then continue
  5.  MSGBOX(変数)
  6. wend
2行目のbreakは繰り返し(for,while,repeat)を抜けます。この場合6行目以降に処理が移ります。4行目のcontinueは繰り返しの先頭に戻ります。この場合5行目の変数の表示をせずに1行目に処理が移ります。日本語っぽくするなら
  1. 次の間繰り返す (変数が 0 より大きい)
  2.  もし (変数が 10 より大きいなら) 次を実行 whileの繰り返すを抜ける
  3.  変数を 1 減らす
  4.  もし (変数が 5 より大きいなら) 次を実行 whileの先頭の戻る
  5.  MSGBOX(変数)
  6. 繰り返しに戻る


式について

いままでいくつか出ましたが式について説明します。式とは算数に出てくるような足し算や掛け算などです。基本の(,),*,/,+,-は算数と同じです。(*は×,/は÷の代わりです)また評価式というのがあり、これは基本的にif,whileの()内に書くものです。(本当はif,whileの()書いたけど()なしの評価式だけでもいいです。)基本は>,<,=,>=,<=,<>で順に右より左が大きい,右より左が小さい,左右同じ,左は右以上,左は右以下,左右が違うです。ここでの=は代入ではないことと、より大きい、以上の違いに気をつけてください。これら以外に!は条件の否定で例えば

  1. if (! (変数 > 0)) then MSGBOX("0より大きくない")
このように(変数が0より大きい)を否定して(変数が0より大きくない)をあらわします。他にAND,ORもあります。コレは条件の結合で例えば
  1. if ((変数 > 0) AND (変数 < 10)) then MSGBOX("0より大きくて10より小さい")
  2. if ((変数 < 0) OR (変数 > 10)) then MSGBOX("0より小さいか10より大きい")
このようになります。似たものにXORがあります。あと特殊なMODというのもありこれは余りの計算に使います。例えば
  1. 変数 = 5 MOD 2
この場合変数には5÷2の余り1が入ります。


わかりやすくするための関数

関数はなくてもスクリプトはかけます。ただしシンプルに書くためには知っておかなければならないでしょう。関数とは処理をまとめたものです。いままで使ったMSGBOX()も関数の1つです。ここでは自分で作る関数について説明します。関数には2つほど種類があります。まず1つは

  1. procedure 関数名(引数1, 引数2)
  2.  MSGBOX(引数1)
  3.  MSGBOX(引数2)
  4. fend
こんな感じで書きます。コレを書いておけば次のように1行で複数の処理ができます。
  1. 関数名(変数1, 変数2)
この1行で引数1と引数2を表示します。引数とは関数呼び出し時に使用する変数のことです。この場合関数を呼び出す時に変数1を引数1に、変数2を引数2にそれぞれ代入して関数の処理を開始します。また引数がない関数を宣言することもできその場合は()だけを書きます。もう1つは
  1. function 関数名(引数1, 引数2)
  2.  result = 引数1 * 引数1 + 引数2 * 引数2
  3. fend
このように書きます。違いはprocedurefunctionになりなかに「result」という変数があることです。resultには特別な意味があります。
  1. 変数3 = 関数名(2, 3)
上記のように変数に代入する値が保存されます。この場合変数3は13(2 × 2 + 3 × 3)が代入されます。resulutを関数の戻値(もどりち)とか返り値(かえりち)とか言います。

関数の制御
exit,exitexitという制御構造があります。exitは関数を抜けて呼び出し元に戻ります。例えば

  1. procedure テスト関数()
  2.  MSGBOX("表示される")
  3.  exit
  4.  MSGBOX("表示されない")
  5.  MSGBOX("表示されない")
  6. fend
このように書くと、この関数が呼ばれたら、2行目は実行されますが、4行目以降は実行されません。exitexitは関数を抜けるだけでなくスクリプト自体を終了します。またexitは関数でないところで実行すればスクリプト自体を終了します。

変数の有効範囲
変数の有効範囲(通常スコープ)について説明しときましょう。変数にはスコープというものがあります。関数内で使用した変数を関数の外で使用することはできません。関数外で使用した変数を関数の中で使用することもできません。

  1. 関数外変数 = 1
  2. 関数()
  3. MSGBOX(関数外変数)
  4. MSGBOX(関数内変数) //この行でエラーが出ます
  5. procedure 関数()
  6.  関数内変数 = 1
  7.  MSGBOX(関数外変数) //この行でエラーが出ます
  8.  MSGBOX(関数内変数)
  9. fend
これは変数を使用するときは自動でローカル変数として作成されるためです。もし関数内外で使用したい変数があるときは次のようにグローバル変数にします。
  1. public 関数外変数 = 1
  2. 関数()
  3. MSGBOX(関数外変数)
  4. MSGBOX(関数内変数) //この行でエラーが消えます
  5. procedure 関数()
  6.  public 関数内変数 = 1
  7.  MSGBOX(関数外変数) //この行のエラーが消えます
  8.  MSGBOX(関数内変数)
  9. fend
publicで変数をグローバル変数とすることをしめします。グローバル変数には制限があります。変数の宣言時に初期値の指定で変数を指定できません。
  1. 変数 = 1
  2. ローカル変数 = 変数
  3. public グローバル変数1 = 変数 //この行でエラーが出ます
  4. public グローバル変数2
  5. グローバル変数2 = 変数 //これはOK

関数とは違いますがCALLというものがあります。これは別ファイルを取り込む時に使用します。いつも使う関数を1つのファイルにまとめておくとかの利用法があります。

  1. CALL UWSファイル名 //拡張子.uwsは省略可能


用意されている関数の説明

説明しようとしたが、面倒なのでかなりはしょります。ヘルプとか見てください。

GETID
ウィンドウの識別子を取得します。

  1. ID = GETID("ウィンドウのタイトル")
  2. ifb (ID < 0)
  3.  MSGBOX("ウィンドウが見つかりません")
  4.  exitexit
  5. endif
戻値が-1のときはエラーです。エラー処理をしときましょう。

MSGBOX
メッセージを表示します。

  1. MSGBOX("メッセージ")
動作チェック等に使用してます。

STATUS
ウィンドウの状態を取得

  1. ID = GETID("タイトル")
  2. X = STATUS(ID, ST_X)
  3. Y = STATUS(ID, ST_Y)
エラー処理省いてます。ウィンドウの左上座標の取得に使用しています。

PEEKCOLOR
画面の色を取得

  1. 色 = PEEKCOLOR(X, Y)
座標(X, Y)の色を取得座標(0, 0)はモニタの左上です。注意することは通常のRGB(赤緑青)の順でなくBGRの順です。例として黄色はRGBでは緑と青の組み合わせですので$00FFFFですが、UWSCではBGRのため$ FFFF00になります。ちなみに$は十六進数を表すときに使用します。

CHKIMG
画像が画面上にあるかチェック

  1. ifb (CHKIMG(画像名, 0, 左上X, 左上Y, 右下X, 右下Y)
  2.  MSGBOX("画像ありました")
  3.  MSGBOX("画像の左上位置は(" + G_IMG_X + ", " + G_IMG_Y + ")です")
  4. endif
左上X,左上Y,右下X,右下Yは省略できるけど、範囲を限定した方が早いと思う。

SLEEP
一時停止します。

  1. SLEEP(0.5)
これで0.5秒停止します。画面の切り替え待ち等に使用します。

MMV, BTN
マウスを操作します。

  1. MMV(X, Y)
  2. BTN(LEFT, DOWN, X, Y)
  3. BTN(LEFT, UP, X, Y)
MMV()でマウスを(X, Y)に移動して,BTN()でマウスを押して放します。

KBD
キーボードを操作します

  1. KBD(VK_ENTER)
これでエンターキーを押します。


変数をまとめた配列

変数の一種に配列というのがあります。配列は同様の値が入る変数をまとめたものです。変数をペットボトルとした考えたら配列はそれが入ったダンボールといったとこでしょうか?

  1. DIM 配列[3] = "お茶", "コーラ", "ビール", "発泡酒"
  2. 配列[3] = "日本酒"
  3. for i = 0 to 3
  4.  MSGBOX(配列[i])
  5. next
画面1画面2画面3画面4
配列は使用前に宣言が必要です。(1行目のDIM)今回はDIMで宣言していますが、これはローカル変数を宣言するときに使用します。グローバル変数としたい場合はDIMの代わりにPUBLICで宣言します。宣言した後は2、4行目のように配列名[インデックス]と書くと普通の変数と同じように使えます。ここでインデックスとは配列の位置で、先頭は0からになり、最後は宣言時の[数]となります。今回は1行目でDIM 配列[3] = …としているので配列[0],配列[1],配列[2],配列[3]の4つが変数と同じように使用できます。

ちょっと高度な多次元配列というものがあります。先の例は一次元の配列(一列にしか入らないダンボール)です。二次元の配列(縦・横に入るダンボール)の例を示します。

  1. DIM 二次元配列[2][3] = "緑茶", "麦茶", "ウーロン茶", "紅茶",_
  2.     "コーラ", "サイダー", "ラムネ", "ジンジャエール",_
  3.     "ビール", "発泡酒", "日本酒", "ワイン"
  4. for 種類 = 0 to 2
  5.  for i = 0 to 3
  6.   MSGBOX(二次元配列[種類][i])
  7.  next
  8. next
実行結果は省略します。まず1,2行目の最後の"_"について説明します。これは行結合といい、行の最後に付けると改行が無視されて次の行と結合されます。長すぎる行などに書き、見やすくするのに使用します。
さて、二次元配列ですが一次元配列と同じように宣言が必要です。(1行目)おわかりのように二次元の場合は"[数]"を2つ書きます。3次元の場合は3つ書きます。(三次元配列[数][数][数])使用時も"[インデックス]"を宣言時と同じ数書きます。一次元は数直線、二次元は座標、三次元は空間という風にイメージします。多次元の場合初期化がわかりづらいですが、二次元配列[X軸][Y軸] = "(0,0)の値", "(0,1)の値", "(0,2)の値", …, "(1,0)の値", "(1,1)の値", …という風に2つ目の"[数]"の0からその数までを書き、次に1つ目の"[数]"が1つづれ2つ目の"[数]"の0からその数までを書き、また1つ目の"[数]"が1つづれ…となります。まぁ実行して考えてみてください。


ver4の機能

いままではver3についての説明でした。2006年07月16日現在ver4.0dが公開されています。ver4には便利な機能が追加されていますので、そのなかのいくつかについて説明を書きます。

定数定義
定数とは決まった数のことです。

  1. DIM 配列[3] = "お茶", "コーラ", "ビール", "発泡酒"
  2. for i = 0 to 3
  3.  MSGBOX(配列[i])
  4. next
1行目と2行目の3という数字はこのスクリプトでは決まっています。このようにスクリプト中にそのまま書かれた数字のことをマジックナンバーと読んでいます。マジックナンバーがあると読み返すときに数字が何を意味していたかを考えないといけないため、できるだけ使わない方がいいと言われています。そこで定数に名前をつけて意味がわかるようにします。
  1. CONST 配列サイズ = 3
  2. DIM 配列[配列サイズ] = "お茶", "コーラ", "ビール", "発泡酒"
  3. for i = 0 to 配列サイズ
  4.  MSGBOX(配列[i])
  5. next
  6. 配列サイズ = 3 // この行でエラーがでます
1行目で"最後のインデックス"という定数をCONSTを使用して定義しています。2行目、3行目で定義した定数を使用しています。これで3行目のfor文が配列全体を繰り返すことがわかりやすくなったはずです。ここで注意が必要なのは、6行目のようにCONSTを使用して定義した定数は値の変更ができません。実行時値が変わるようなものはそもそも定数とは言わず、変数となるので通常の変数を使用してください。

関数の引数省略
関数には引数を指定できました。そして関数宣言で指定した引数の個数と関数呼び出しで指定する引数の個数は同じになります。もし個数が違った場合はエラーがでます。引数の中には普段は決まった値を使用し、特別な場合に違った値を使用するような場合があります。そんな時に、標準で用意されている関数のように引数を省略できると便利です。

  1. 関数(10, 20)
  2. 関数(10, 20 , "-")
  3. procedure 関数(引数1, 引数2, 引数3="+")
  4. 値 = 引数1
  5. select (引数3)
  6. case "+"
  7.  値 = 値 + 引数2
  8. case "-"
  9.  値 = 値 - 引数2
  10. selend
  11. MSGBOX(値)
  12. fend
これは指定がなければ足し算をして、指定があればその演算をする関数です。1行目、2行目が同じ"関数"を読んでいますが、引数の個数が違います。これは3行目の関数宣言で引数="+"とあるためエラーが出ません。これをデフォルトパラメータとかデフォルト引数と呼びます。関数呼び出しで3つ目の引数が省略された場合は引数3に"+"が、指定された場合は引数3に指定されたものが入ります。ここで注意があります。
  1. 関数(10)
  2. 関数(10, 20)
  3. 関数(10, 20 , "-")
  4. 関数(10, "-") // 動作に注意
  5. procedure 関数(引数1, 引数2=10, 引数3="+")
  6. 値 = 引数1
  7. select (引数3)
  8. case "+"
  9.  値 = 値 + 引数2
  10. case "-"
  11.  値 = 値 - 引数2
  12. selend
  13. MSGBOX(値)
  14. fend
5行目のように引数2にもデフォルトパラメータを指定した場合、1,2,3行目は思った動作をしてくれます。ただし4行目は"10 - 10"の結果"0"を表示されると思うかもしれませんが違います。
結果
このように引数2が"-"になり、引数3が省略されたため"+"となり、その結果"10-"というものが表示されます。呼び出し時の引数は前から順に指定されたとみなし、省略できるのは後の連続した部分のみです。ご注意ください。また
  1. procedure 関数(引数1, 引数2=10, 引数3) // エラーがでます
このように途中をデフォルトパラメータ指定したのに、その後の引数では省略不可にした場合はエラーがでます。

関数への参照渡し(前からあったかも?)
今まで関数へ引数を渡していましたが、これは値渡しと呼ばれるものです。引数の渡し方には値渡しのほかに参照渡しと呼ばれるものがあります。

  1. ローカル変数 = 0
  2. MSGBOX("初期のローカル変数 = " + ローカル変数)
  3. 値渡し(ローカル変数)
  4. MSGBOX("値渡し後のローカル変数 = " + ローカル変数)
  5. 参照渡し(ローカル変数)
  6. MSGBOX("参照渡し後のローカル変数 = " + ローカル変数)
  7. procedure 値渡し(引数)
  8.  引数 = 10
  9. fend
  10. procedure 参照渡し(var 引数)
  11.  引数 = 20
  12. fend
初期値 = 0値渡し後 = 0参照渡し後 = 20
参照渡しは10行目のように参照渡しをしたい引数にvarをつけて宣言します。3行目では通常の宣言の関数(7行目)を呼び出しています。5行目では参照渡しで宣言した関数(10行目)を呼び出しています。どちらの関数内でも"引数 = …"と引数の値を変更しています。しかし、値渡しの方は渡したローカル変数の値は変更されていませんが、参照渡しの方では渡したローカル変数の値が変更されています。このように渡した変数の値を変更できるのが参照渡しになります。

関数に配列を渡す
関数の引数に配列を指定できるようになりました。

  1. DIM 配列[2][2] = "お茶", "コーラ", "ビール",_
  2.   "発泡酒", "焼酎", "ワイン"
  3. 関数(配列)
  4. procedure 関数(引数[][])
  5.  MSGBOX(引数[1][1])
  6. fend
引数に配列を指定する場合は4行目のように引数[][]の様に宣言します。これは二次元配列を引数としているため[]が2つありますが、1次元なら1つ、3次元なら3つとなります。(引数[2][2]と書くこともできますが、引数[10][0]などと書いても結果が変わらないことから配列サイズを指定しても無視されていると思います。)もちろん配列も同様に"var"を指定すれば参照渡しができます。ただし、デフォルトパラメータ指定はできないようです。

配列の初期化を簡略化

  1. DIM 配列1[3] = "お茶", "コーラ", "ビール", "発泡酒"
  2. DIM 配列2[] = "お茶", "コーラ", "ビール", "発泡酒"
いままで1行目のように[3]とサイズを指定していましたが、2行目のように[]とサイズを省略できるようになりました。省略した場合は初期化で指定した個数分のサイズと自動的になります。

ループレベル
CONTINUEとBREAKでループレベルが指定できるようになりました。

  1. for i = 1 to 3
  2.  for j = 1 to 3
  3.   MSGBOX("i = " + i + " j = " + j)
  4.  next
  5. next
上のスクリプトは"i = 1 j = 1","i = 1 j = 2",…,"i = 3 j = 3"と9回メッセージが表示されます。
  1. for i = 1 to 3
  2.  for j = 1 to 3
  3.   MSGBOX("i = " + i + " j = " + j)
  4.   break
  5.  next
  6. next
このスクリプトは"i = 1 j = 1","i = 2 j = 1","i = 3 j = 1"と3回メッセージが表示されます。これは今までの動作と同じく、4行目のbreakは2行目のforを抜けます。
  1. for i = 1 to 3
  2.  for j = 1 to 3
  3.   MSGBOX("i = " + i + " j = " + j)
  4.   break 2
  5.  next
  6. next
次のスクリプトは"i = 1 j = 1"と1回だけメッセージが表示されます。これは4行目のbreak 2で2行目のforだけでなく1行目のforまで抜けてしまったためです。このようにbreak ループレベルと書くとループレベルの数だけforやwhileなどを抜けます。そして、continue ループレベルも同様にループレベルが指定できます。

以上、新機能をいくつか説明してきました。ここで注意して欲しいことは、新機能を使って書かれたスクリプトを古いバージョンのUWSCで実行することができないことです。もし、手に入れたスクリプトが実行できないときは新バージョンを試してみるといいかもしれません。


最後に

かなりはしょった説明です。もっと知りたければヘルプとか他人のスクリプトを参考にして日々精進してください。

スペース
管理人:Big
コンテンツトップ
  ページトップ