HSP3 プログラミングの基礎X
前へ 目次へ 次へ 

(2) コマンドライン取得

◎ コマンドライン

 コマンドラインとは、文字で情報を入出力するユーザインタフェースのことである。コマンド(命令)やパラメータ(引数)を文字で入力する。このコマンドとパラメータをあわせてコマンドライン(命令行)とも呼ぶ。
 パラメータには、実行に必要なデータだけでなく、プログラムの機能を変えるための情報の文字列を指定することもある。したがって、パラメータと呼ぶ代わりにオプションまたは起動オプションなどと呼ぶこともある。

 実行ファイル(コマンド)を実行するとき、パラメータをつけて実行することができる。例えば、2つの数をパラメータで指定して加算するプログラムkasan.exeがあるとき、コマンドプロンプトを使って次のように実行する。

C:\>kasan  10  20
30
C:\>
"C:\>"はプロンプト(入力促進記号)といい、コマンドプロンプトが表示する。設定によって変更することができる。

 命令(実行ファイル名)に続く10と20がパラメータであり、1つ以上の空白で区切って指定する。

 HSPで作成したプログラムをDドライブのworkフォルダに保存して、実行ファイルも同じworkフォルダに作成したとする。Windowsのスタートメニューから、[すべてのプログラム(P)] → [アクセサリ] → [コマンドプロンプト]と選択してコマンドプロンプトを起動する。

C:\Documents and Settings\username>
マイ ドキュメントのパス名が表示される。Windowsのバージョンによっては"C:\My Documet>"など表示は変わる。
 プロンプト"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つの関数を使用する。

instr(変数, 開始位置, 検索文字列)
 変数の開始位置(先頭からの文字数)から検索文字列を検索して結果を返却する関数である。開始位置は0から数える。見つからなかったときは-1が返却される。
strmid(変数, 開始位置, 文字数)
 変数の開始位置(先頭からの文字数)から文字数分の文字列を取り出して返却する関数である。開始位置は0から数える。開始位置に負数を指定すると変数の末尾からの指定になる。


サンプル(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」だけが表示される。

・トレース
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) 停止
 2つのパラメータ「10 20」のうち、「10」だけしか表示されない(取り出せない)。

 パラメータ「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 

 

 

inserted by FC2 system