> こんにちは。
こんにちは
> プログラミング掲示板にするか迷いましたが、こちらに。よく理解しているか分からない者の報告ですが、今回は ByRef と BytePtr の関数についてです。
よく分からない段階では「質問掲示板」の方がいいかもしれませんね。
誰か他にも問題に気付いている方が居られれば、確実にバグと判断できますし、
バグでないならないで解決法を載せられますから。
さて本題です。
コード: 全て選択
Sub TestByRef(ByRef ByteLine As BytePtr)
End Sub
この関数の引数を見ると「ポインタ変数へのアドレス参照」となっていることがわかりますね。
即ち、この関数は
関数内でポインタ変数内に格納されたアドレスを書き換えることができる状態になります。
これを踏まえて以後のプログラムを見てみると問題解決に繋がるのではないかとおもいます。
まず③ですが、これは単純に引数がポインタ参照なのにアドレス値を指定しているというミスです。
アドレス値はあくまで値参照扱いです。
コード: 全て選択
TestByRef(VarPtr(lpCommandLine[数字])) ...③
次に⑤です。
これはパッと見問題が無いように思えますが、少し考えてみると③と同じミスです。
配列の添え字を省略すると確かに配列の先頭のアドレス値が返りますが、
これは先に述べたようにByRefのポインタ参照ではなくByVal参照が必要です。
コード: 全て選択
TestByRef(lpW32FD->cFileName) ...⑤
因みにByRef参照をByVal参照に一時変換できる方法がありますので
そちらを使うと③も⑤もエラーはでません
コード: 全て選択
TestByRef(ByVal VarPtr(lpCommandLine[数字]))
TestByRef(ByVal lpW32FD->cFileName)
続いて⑦⑧ですがこれも③⑤と同じミスです。
VarPtrでアドレス値をByRefのポインタ参照に渡したい場合はByValを使います。
コード: 全て選択
TestByRef(VarPtr(W32FD.cFileName)) ...⑦
TestByRef(VarPtr(W32FD.cFileName[数字])) ...⑧
修正すると下になります。
コード: 全て選択
TestByRef(ByVal VarPtr(W32FD.cFileName))
TestByRef(ByVal VarPtr(W32FD.cFileName[数字]))
関数の引数に指定するByValとByRefの違いは慣れていないと結構勘違いし易いです。
2つには使い方にかなり違いがありますし、ポインタ型と組み合わせるとさらに面倒です。
コード: 全て選択
/* 値参照を使った引数 */
/* もっとも基本的な引数 */
Sub Proc1(x As Long)
End Sub
/* ポインタ参照を使った引数 */
/* ポインタを意識しなくて良い所が便利 */
Sub Proc2(ByRef x As Long)
End Sub
/* 値参照とポインタ型を組み合わせて使った引数 */
/* 配列操作や文字列操作なんかに便利 */
Sub Proc3(x As *Long)
End Sub
/* ポインタ参照とポインタ型を組み合わせて使った引数 */
/* 滅多に使わないというより、使えるような用例が見当たりません */
Sub Proc4(ByRef x As *Long)
End Sub