FreeBASIC マニュアルのトップに戻る

FreeBASIC Byval

目次→命令文→手続きBYVAL←オリジナル・サイト

BYVAL 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

パラメタを、明示的に、値渡しする、宣言指定子。

構文:
Byval param as datatype

用法:
[ declare ] { sub |function } proc_name ( Byval param as datatype )

記述:
宣言命令の引数リストで Byval とすると、変数の値のコピーを、手続き (sub や function) に渡します。

これは、変数 x の値が手続きに渡された場合、元の変数 x は、変更されないことを意味します。
一方、変数が Byref で渡された場合は、元の変数 x の値は、呼ばれた手続きの過程で変更される可能性があります。

注意:
文字列引数のために、Byval は、現在、異なった意味があります:
文字列のコピーを渡す代わりに、zstring ポインタを文字列データに渡します。一方、Byref は、FreeBASIC 文字列記述子に、ポインタを渡します。
このような振舞いから、Byval String を、直接 C の手続きに渡すことができます。
この方法で渡された文字列は、Sub/Function で変えられません。文字列記述子をアップデートしないからです。
String Byval を渡す意味は、将来、変わるかもしれません。 したがって、 String Byval を渡すことは避けるべきです。
Zstring は、C 関数に、zero-terminated strings を渡す目的で、より適しています。

ByRef の反対です。

Byval キーワードは、 Byref(パラメータ)BYREF (関数結果) の文脈の中でも使うことができます。
これを使うと、参照の意図を明示的に無視して、ポインターをそのまま Byref パラメーターや関数結果に渡したり代入したりするために使うことができます。
下記を参照下さい:

注意: Byval (コピー渡し)は、数値型のように、コピーが簡単な小さなオブジェクト(4バイトまたは8バイトか、もう少し大きくても大丈夫です)に適しています。
Byval で渡すことで、ByRef が使うポインタのオーバーヘッドを回避できます。
ByRef は、文字列や、コピーしてはいけない大きな UDT などの、巨大なオブジェクトを渡すのに適しています。
ByRef は、ポインタを渡す必要があるため(およびオブジェクトへのアクセスごとに間接参照する必要があるため)オーバーヘッドがありますが、手続きが呼び出されるたびに多数のバイトをスタックにコピーするよりも、優れています。

例:
Sub MySub (ByVal value As Integer)
    value += 1
End Sub

Dim MyVar As Integer

MyVar = 1
Print "MyVar: "; MyVar '出力 = 1
MySub MyVar
Print "MyVar: "; MyVar '出力 = 1, byval は、値を変えません。どこでも、そのまま渡されます。
Sleep
End



方言差:

QBからの違い:

参照:
手続きに戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2018-08-12 14:10:09
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

ホームページのトップに戻る

表示-非営利-継承