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

FreeBASIC 学習ノート 8.4 ポインターと関数/手続き

目次→教本→いっしょに学ぼうhttps://blog.csdn.net/rainheart311/article/details/78836829←オリジナル・サイト

学習ノート 8.4 ポインターと関数/手続き 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

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

←前:8.3 ポインターと配列

8.4.1、関数/手続きのパラメーターとしてのポインター

ポインターは、関数または手続きーの引数として使用できます。特に、システムAPI関数または他のライブラリーを呼び出す場合、多くの関数引数がポインターを介してデータを渡すことがわかります。関数または手続きへの引数でのポインタの使用に注意してください。

1、ポインター自体はアドレス・データなので、ByVal と ByRef で変更の結果が同じです。値が関数に渡される場合や、プロセスが元のデータを変更しない場合は、プロセス内の実際の関数またはデータは同じアドレスで動作するためです。
したがって、元のデータを変更したくない場合は、データをコピーして関数内のメモリを再割り当てする必要があります。

2、ポインターを操作するとき、演算子 [] または * を使えます。
演算子 [] を使うと、実際には1次元配列の操作と同じで、とても便利です。

3、ポインタを使って関数または手続きを呼び出すときは、アドレス、特に配列をパラメータとして渡す必要があります。

関数または手続きへの引数としてのポインタの使い方を説明するための、ソート例です:

'ソートを実行。パラメーターとしてポインターを使用

Sub SelectionSort(a As Integer Ptr,ByVal Nums As Integer)
   Dim As Integer i,j
   For i = 1 To (Nums - 1)     'ここで 2 重ループ
      For J = i + 1 To Nums
         '[]を使うと、1 次元配列の操作と同じで、便利です。
         If a[i] > a[j] Then  '前が後より大きければ交換
            Swap a[i],a[j]
         End If
      Next j
   Next i
End Sub

Dim a(1 To 10) As Integer
Dim i As Integer

Randomize

For i = 1 To 10
   a(i) = Int(Rnd * 50) + 1 '1 〜 50 の整数
   Print a(i) & "  ";
Next i
Print     '改行
Print

SelectionSort(@a(0),10)   '呼び出し時に配列の最初の要素のアドレスを渡す必要があります
                          ' a() や a(0) は使えません

For i = 1 To 10
   Print a(i) & "  ";
Next i

Sleep


8.4.2、関数の戻り値としてのポインター

 ポインタが関数として値を返す場合、アドレスデータを返します。このデータは、単一の変数のアドレスを返すか、配列などの連続したメモリ領域の最初のアドレスを返すことができます。
 ポインタで返す場合、値ではなく、返されるデータのアドレスである必要があります。ここでは、ByRefとポインターリターンの違いを区別する必要があります。

構文は次のとおりです:


例:ポインターリターン


例:ByRef で返す場合、アドレスを返す代わりに、戻り値としてグローバル変数が必要です。



8.4.3、関数/手続きへのポインタ

 各関数または手続き名は実際にはエントリ(入口)アドレスです。アセンブリに精通している場合、概念を理解するのは簡単です。アセンブリ内のエントリアドレスは、関数名のラベルで定義されたアドレスです。FreeBASICでも同じです。
 各関数または手続きにはエントリ(入口)アドレスがありますポインタを使用して関数または手続きにアクセスする場合、アドレスをポイントするだけでよく、これはポインタを変数にポイントするのと同じです。
 関数または手続きを宣言する際に注意すべきことの1つは、関数のパラメーターと戻り値が、それを指す関数と一致していることです。

文法:



1、変数として使用

例:

'手続きへのポインタ

Sub Add(a As Integer,b As Integer)  '手続き
   Print a + b
End Sub

Dim myproc As Sub(As Integer,As Integer) = @Add  'ポインター変数を定義し、@で手続きアドレスを取得

myproc(1,2)  'ポインター変数呼び出し手続き

'関数へのポインター
Function add2(a As Integer,b As Integer) As Integer  '関数
   Return a + b
End Function

Dim myproc2 As Function(As Integer,As Integer) As Integer = ProcPtr(add2) 'ProcPtrで関数アドレスを取得

Print myproc2(1,2)

Sleep

2、パラメーターとして使用

例:

'パラメーターとして使用

Function myadd(a As Integer,b As Integer) As Integer  '関数
   Return a + b
End Function

Sub mysub(Add As Function(As Integer,As Integer) As Integer,ByVal c As Integer) 'ポインター関数パラメーター
   Print Add(1,2) + c
End Sub

mysub(@myadd,10)  '呼び出し

Sleep

参照ブログ:http://www.office-cn.net/blog-230471-15223.html

←前:8.3 ポインターと配列
いっしょに学ぼう に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2017-12-18 20:28:51
日本語翻訳:WATANABE Makoto、原文著作者:rainheart311

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

表示-非営利-継承