過去の桐井戸端BBS (桐ver.9)
24353 手続き定義開始で定義する引数を可変引数にしたい 大野達郎 2004/01/21-16:42
手続き定義についての質問です。
手続き定義開始で定義する引数を可変引数にすることは可能でしょうか?
もしくは同じ手続き名で引数の数を変え、手続きのオーバーロードとかできないでしょうか?
せめて、手続き実行で引数を入力しないとデフォルト値が入るとかできると助かるのですが・・・
桐の標準手続きには引数入力しないとデフォルト値が入るものが多いので、
この辺もどうにかなるような気がしたので質問させて頂きました。
桐は初心者なので、検討違いの質問をしていたら、ごめんなさい。
24357 手続きの引き数 佐田 守弘 2004/01/21-21:11
記事番号24353へのコメント
大野達郎さん
●手続きを実行する時の引き数
桐の手続きでは、実行時に引き数を渡せます。
イベントハンドラの手続きの多くはこれを使っていますが、一般手続きでも可能です。
ただし実際には余り使われてないのではないでしょうか。
理由は後で述べますが、引き数を使わなくても済む事が多いためかと思います。

手続き実行コマンドの括弧内に引き数を記述すると、
その値が手続き定義開始以降の手続きの中で値として参照されるわけですが、
引渡す値のデータ型を合わせておく必要があります。
しかし値の数を合わせなくても良いのかどうかについては、ヘルプにも明確な記載がされていません。
(多分、数とデータ型の両方を合わせる必要があるのではと考えます。)

●手続き内で宣言する変数の数を可変とする方法
「引数を可変引数にする」とは、引き数の数を可変としたいとの意味だと思います。
手続き定義開始コマンドの後ろに記述する変数として、配列変数を指定し、配列要素数の指定を省略します。
【例】手続き定義開始 ある処理(文字列 &値[])
この様に配列要素数の指定を省略すると、引渡される引き数の値に応じて、
配列の要素数が決められるので、実質的に引き数の数を可変とする事ができます。

■ 一般手続きでの引き数の引渡しの必要性について
桐の手続きで引き数を引渡す機能は、特に使わなくても済む場合が多いのではないかと思います。
その理由として、次の様に考えます。

●桐の手続きは一般にサブプログラムではない
桐の手続きは、メインプログラムの後半に記述する場合が普通です。
メインプログラム内にあるために、イベントのメイン部分ないしは一括処理の先頭で宣言した変数、
ないしはフォームで宣言される局所変数が有効です。
敢て、引き数を使って値を引渡さなくても、単純に変数の値を参照すれば済む話です。
その変数が宣言されているかどうか、値が未定義でないかどうかも手続きの中で確認できます。

●サブプログラムとして作る手続き
桐ではサブルーチンサブプログラム方式も使えます。これはライブラリの機能です。
汎用的に使う手続きを1つないし複数まとめて一括処理と同じcmd形式のファイルとして作っておきます。
利用する一括処理ないしイベントの初めの方にライブラリコマンドを使って、そのファイルを指定しておくと、
その中にある手続きが自身のプログラム内にある場合と同じ様に呼び出せる機能です。
この様なライブラリを使う場合には、ライブラリ内で使われている変数名を確認しなくても値が引渡せる様に、
手続きの引き数で引渡すのが便利な場合があります。

とは言え、桐の固有変数は案外とグローバルで、ウィンドウが全て閉じられない限り有効です。
つまり一括処理内やイベントのメイン部分で宣言した固有変数は、
ライブラリ内でも有効なため、引き数で引渡さなくても済んでしまう場合がほとんどではないでしょうか。

佐田守弘(KS-00119)
24361 Re:手続きの引き数 大野達郎 2004/01/22-12:49
記事番号24357へのコメント
佐田守弘さん、早速のレスありがとうございます。
丁寧な説明で助かります。
色々、参考にさせてもらいました。


>●手続き内で宣言する変数の数を可変とする方法
>「引数を可変引数にする」とは、引き数の数を可変としたいとの意味だと
>思います。
>手続き定義開始コマンドの後ろに記述する変数として、配列変数を指定
>し、配列要素数の指定を省略します。
>【例】手続き定義開始 ある処理(文字列 &値[])
>この様に配列要素数の指定を省略すると、引渡される引き数の値に応じて、
>配列の要素数が決められるので、実質的に引き数の数を可変とする事が
>できます。

ここについての質問なのですが、
実験で以下のような一括を組んでみたところ、エラーが出てしまいました。

変数宣言 文字列{ &test[2] = {"1", "2"} }
手続き実行 てすと(&test)
手続き定義開始 てすと(文字列 &temp[])
 メッセージボックス "", &temp[1] + "/" + &temp[2]
手続き定義終了

この一括だと、どの辺がおかしいのでしょうか?
(エラーは3行目、KU1090:コマンドの形式に誤りがあります とでます)
桐のヘルプは"実際の引数の引き渡し"のような場合の例が少なく、
値をどのような渡し方をすればいいのか、具体的に分からない場合が多くあります。
24363 Re:手続きの引き数 ONnoji 2004/01/22-14:51
記事番号24361へのコメント
>変数宣言 文字列{ &test[2] = {"1", "2"} }
>手続き実行 てすと(&test)
>手続き定義開始 てすと(文字列 &temp[])
> メッセージボックス "", &temp[1] + "/" + &temp[2]
>手続き定義終了
>
>この一括だと、どの辺がおかしいのでしょうか?
>(エラーは3行目、KU1090:コマンドの形式に誤りがあります とでます)

大野達郎さん、こんにちは。佐田守弘さん、横レス失礼します。m(__)m

変更前 手続き定義開始 てすと(文字列 &temp[])
変更後 手続き定義開始 てすと(参照 文字列 &temp[])

桐ver.8 sp5で試したところ、
変更後のようにに引数を参照渡しにするとエラーになりませんでした。

どうしてなのかは分かりませんけれど…(^^ゞ

ご参考になれば幸いです。

24374 Re:手続きの引き数 アックン(=^・^=) 2004/01/23-13:04
記事番号24363へのコメント
ONnojiさん、大野さん、こんにちは。

>変更前 手続き定義開始 てすと(文字列 &temp[])
>変更後 手続き定義開始 てすと(参照 文字列 &temp[])

もし参照する必要がない場合は、要素数を明示してやればいいはずです。

     手続き定義開始 てすと(文字列 &temp[2])

&tempの要素数は、&testの要素数が2個ですから、2個またはそれ以上であればいいです。

     手続き定義開始 てすと(文字列 &temp[10])

この場合、&temp[3]〜&temp[10]には未定義値が入ります。

もし要素数を明示しないときは、必ず「参照」を付ける必要があったと思います。

最初の質問は、引数の数だけ書かなくてもいい書き方はないか、
つまり引数を可変にする書き方はないか、ということだったと思うので、
用途によって「参照」を付けるか付けないかを使い分ければいいんじゃないでしょうか。

大野さん>
「参照」を付けると、手続き「てすと」内でもし&tempの値を変更すると、
&testの値が変更されます。(変更時点は手続き実行を終えた次行から。)
つまり、手続き「てすと」内の変数値を参照できるわけです。その点の違いです。
ですから、変数値に変更があったかもしれないことを忘れないようにしてください。
24382 Re:手続きの引き数 大野達郎 2004/01/23-16:37
記事番号24374へのコメント
ONnojiさん、アックンさん、レスをありがとうございます。

>変更前 手続き定義開始 てすと(文字列 &temp[])
>変更後 手続き定義開始 てすと(参照 文字列 &temp[])

参照をつけることにより、こちらもエラーがなくなりました。(ver.9)
どうもありがとうございます。

>「参照」を付けると、手続き「てすと」内でもし&tempの値を変更すると、
>&testの値が変更されます。(変更時点は手続き実行を終えた次行から。)
>つまり、手続き「てすと」内の変数値を参照できるわけです。その点の違いです。
>ですから、変数値に変更があったかもしれないことを忘れないようにしてください。

どうやら、参照というのはC言語のポインタのようですね。
そう考えるとかなり納得いきました。
この場合、ちゃんと #配列要素数("temp") で &temp[] の正確な配列数がでるようなので、
内部でのループカウンタも問題なくまわせました。

こちらで実験したのですが、やはり手続きのオーバーロードはないようですね。
同じ宣言がある、と怒られました。

今回のアドバイスを元に良いライブラリが組めました。
配列の参照渡しのおかげで汎用性もバッチリです。
皆様のご協力のおかげです。
ありがとうございました。

戻る