HSP3 プログラミングの基礎X | |
(2) コマンドライン取得
◎ コマンドライン
コマンドラインとは、文字で情報を入出力するユーザインタフェースのことである。コマンド(命令)やパラメータ(引数)を文字で入力する。このコマンドとパラメータをあわせてコマンドライン(命令行)とも呼ぶ。
パラメータには、実行に必要なデータだけでなく、プログラムの機能を変えるための情報の文字列を指定することもある。したがって、パラメータと呼ぶ代わりにオプションまたは起動オプションなどと呼ぶこともある。
実行ファイル(コマンド)を実行するとき、パラメータをつけて実行することができる。例えば、2つの数をパラメータで指定して加算するプログラムkasan.exeがあるとき、コマンドプロンプトを使って次のように実行する。
"C:\>"はプロンプト(入力促進記号)といい、コマンドプロンプトが表示する。設定によって変更することができる。
C:\>kasan 10 20
30
C:\>
命令(実行ファイル名)に続く10と20がパラメータであり、1つ以上の空白で区切って指定する。
HSPで作成したプログラムをDドライブのworkフォルダに保存して、実行ファイルも同じworkフォルダに作成したとする。Windowsのスタートメニューから、[すべてのプログラム(P)] → [アクセサリ] → [コマンドプロンプト]と選択してコマンドプロンプトを起動する。
マイ ドキュメントのパス名が表示される。Windowsのバージョンによっては"C:\My Documet>"など表示は変わる。
C:\Documents and Settings\username>
プロンプト"C:\Documents and Settingd\username>"は作業対象となるフォルダ名が表示されるのが一般的であり、「カレントフォルダ」と呼ぶ。この状態でファイルを保存するとCドライブのDocuments and Settingsフォルダのusernameフォルダに保存される。
プログラムを保存したフォルダに移動する。
C:\Documents and Settings\username>d:
D:\>cd ¥work
D:\work>
プログラムのテストをするだけであれば、HSPスクリプトエディタのメニューバーか次のように選択して、起動オプション指定のダイアログでパラメータを設定して実行することができる。
[HSP(P)] → [起動オプション(O)...]
◎ コマンドライン表示
(cmdline01.hsp)
コマンドラインのオプション(パラメータ)を表示する。
;cmdline01.hsp
mes dir_cmdline
stop
メニューバーから [HSP(P)] → [起動オプション(O)...] と選択して、起動オプション指定 のダイアログで「10 20」と入力してから実行する。
ウィンドウに「10 20」と表示される。
パラメータはシステム変数dir_cmdlineに格納される。
◎ コマンドライン解析
前のサンプルでは、パラメータは「10△20」(△は空白)は文字列として格納されている。実際には、「10」と「20」に分けて取り出す必要がある。
ここでは、文字列を操作する次の2つの関数を使用する。
変数の開始位置(先頭からの文字数)から検索文字列を検索して結果を返却する関数である。開始位置は0から数える。見つからなかったときは-1が返却される。
instr(変数, 開始位置, 検索文字列)
変数の開始位置(先頭からの文字数)から文字数分の文字列を取り出して返却する関数である。開始位置は0から数える。開始位置に負数を指定すると変数の末尾からの指定になる。
strmid(変数, 開始位置, 文字数)
(cmdline02.hsp)
コマンドラインのパラメータを一つずつ表示する。パラメータは「10△20」とする。
;cmdline02.hsp
para = dir_cmdline
repeat
ps = instr(para, 0, " ") ;空白(区切り文字)を検索
if ps = -1 : break ;空白がなければ終了
mes strmid(para, 0, ps) ;パラメータ表示
para = strmid(para, ps + 1, 80) ;パラメータの残りをparaに格納
await 100
loop
stop
パラメータ「10」だけが表示される。
・トレース2つのパラメータ「10 20」のうち、「10」だけしか表示されない(取り出せない)。
para = dir_cmdline (1) para="10 20" repeat (2) (8) ps = instr(para, 0, " ") (3) ps=2 (9) ps=-1 if ps = -1 : break (4) (10) 抜け出す mes strmid(para, 0, ps) (5) 表示=10 para = strmid(para, ps + 1, 80) (6) para="20" await 100
loop
stop(7) (11) 停止
パラメータ「20」の後には空白がないため、(9)では空白が見つからなかったときの-1がpsに格納される。
(cmdline02b.hsp)
改良:コマンドラインのパラメータを一つずつ表示する。パラメータは「10△20」とする。
;cmdline02b.hsp
para = dir_cmdline
repeat
ps = instr(para, 0, " ") ;空白(区切り文字)を検索
if ps = -1 : mes para : break ;空白がなければ終了
mes strmid(para, 0, ps) ;パラメータ表示
para = strmid(para, ps + 1, 80) ;パラメータの残りをparaに格納
await 100
loop
stop
10と20が2行で表示される。
・トレース
para = dir_cmdline (1) para="10 20" repeat (2) (8) ps = instr(para, 0, " ") (3) ps=2 (9) ps=-1 if ps = -1 : mes para : break (4) (10) 表示=20、抜け出す mes strmid(para, 0, ps) (5) 表示=10 para = strmid(para, ps + 1, 80) (6) para="20" await 100
loop
stop(7) (11) 停止
別の方法として、1行目を para = dir_cmdline + " " として、パラメータの末尾に半角空白1文字を追加する。
パラメータが「10△△20」であるとき、「10」と「△」と「20」の3つが表示される。次はこれを解消する。
(cmdline02c.hsp)
改良:コマンドラインのパラメータを一つずつ表示する。パラメータは「10△△20」とする。
;cmdline02c.hsp
para = dir_cmdline + " "
repeat+
*retry
ps = instr(para, 0, " ") ;空白(区切り文字)を検索
if ps = 0 { ;先頭が空白なら
para = strmid(para, ps + 1, 80)
goto *retry
}
if ps = -1 : break ;空白がなければ終了
mes strmid(para, 0, ps) ;パラメータ表示
para = strmid(para, ps + 1, 80) ;パラメータの残りをparaに格納
await 100
loop
stop
10と20が2行で表示される。
(cmdline03.hsp)
パラメータを加算して結果を表示する。パラメータは「10△20」とする。
;cmdline03.hsp
sdim dt, 8, 10 ;パラメータ用8けた10個
para = dir_cmdline + " "
repeat
*retry
ps = instr(para, 0, " ") ;空白(区切り文字)を検索
if ps = 0 { ;先頭が空白なら
para = strmid(para, ps + 1, 80)
goto *retry
}
if ps = -1 : break ;空白がなければ終了
dt(cnt) = strmid(para, 0, ps) ;パラメータ取得
para = strmid(para, ps + 1, 80) ;パラメータの残りをparaに格納
;await 100
loop
total = 0
repeat
if dt(cnt) = "" : break
total = total + dt(cnt)
loop
mes total
stop
加算結果10が表示される。
パラメータ「10△△20」としても正しく結果が表示される。さらに、「10△20△30△40△50」のようにパラメータの個数を増やしても正しい結果が表示される。ただし、パラメータの個数は配列で用意している10個までである。
2007 © Hiroshi Masuda |