初心者の質問です(ポインタについて)

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 初心者の質問です(ポインタについて)

by konisi » 2008年12月09日(火) 15:48

>ByValが指定されていなくても自動的に指定されるのでプログラムには影響ないということですね?
そうですね。付属ヘルプの「リファレンス」→「言語コプセント」→「関数」→「パラメータ」あたりに古い資料があります。
CrotchetMan さんが書きました:Dim 変数[100] As 型 と
Dim 変数(100) As 型 ではどちらも同じ効果なんですか?
(少なくともAB4では)同じ意味になります。
CrotchetMan さんが書きました:100と指定した場合、変数[0]~変数[99]までで100個使えるという意味ではなくて、
変数[0]~変数[100]の101使えるという意味になるんですか?
典型的なC系の言語等では0~99になりますが、ActiveBasicでは0~100になります。
CrotchetMan さんが書きました:0を代入する意味としては何があるのですか?
初期化か何かですか?
そのすぐ下でlstrcatを使うので、初期化をしている事になります。
lstrcat,lstrcpyを始めとする多くの文字列操作関数は「0終端文字」と呼ばれるタイプの文字列を扱います。
そのため、バッファが空である事を示す為に0を代入しています。
CrotchetMan さんが書きました:あともうひとつ疑問があるんですが、
ポインタは32ビットであらわされていますが、
BytePtrということは、
かならず型は ByteArrayで宣言された型(Byte)でないといけないんですか?
そんな事はなく、ただそのポインタをどんな型へのポインタとして扱うかで決めます。
ですので、次のようなコードも問題なく動作します。

コード: 全て選択

#console
Dim A As Long,ptr As BytePtr
A=&H01020304
ptr=VarPtr(A)
'4バイトの値を1バイトずつに分けて表示しています。
'メモリへの格納方式がリトルエンディアンかビッグエンディアンかで結果が違います。
Print ptr[0]
Print ptr[1]
Print ptr[2]
Print ptr[3]
'ポインタに格納されているのはただの値なので、それを表示したりすることも出来ます。
Print ptr
Sleep(-1)

返信ありがとうございます

by CrotchetMan » 2008年12月08日(月) 23:52

返事遅れてすみません。
わかりやすい回答ありがとうございました。


> 省略された時にはByValの指定がかかります。

ということは、

コード: 全て選択

Sub GetTextBuffer(ByVal lpByte As BytePtr
でByValが指定されていなくても自動的に指定されるのでプログラムには影響ないということですね?

>(100)の部分は配列として宣言する為の指定ですね

Dim 変数[100] As 型 と
Dim 変数(100) As 型 ではどちらも同じ効果なんですか?

>配列の要素は、ここでは0~100まで使えるので要素数は101個ですね。

100と指定した場合、変数[0]~変数[99]までで100個使えるという意味ではなくて、
変数[0]~変数[100]の101使えるという意味になるんですか?

>

コード: 全て選択

lpByte(0)=0

>としていますが、これは実際にはByteArray配列の先頭の要素に0を代入していま>す。

0を代入する意味としては何があるのですか?
初期化か何かですか?

あともうひとつ疑問があるんですが、
ポインタは32ビットであらわされていますが、
BytePtrということは、
かならず型は ByteArrayで宣言された型(Byte)でないといけないんですか?

by konisi » 2008年12月06日(土) 14:56

まず

コード: 全て選択

Dim ByteArray(100) As Byte
こいつは、ByteArrayって名前のByte型配列を宣言してます。
ByteArrayに実際に入っている値は配列の先頭要素へのアドレス(ここではBytePtr型)で、
ByteArray(0)でByteArray配列の先頭の(0番目の)要素にアクセスできます。
配列の要素は、ここでは0~100まで使えるので要素数は101個ですね。

次に

コード: 全て選択

Sub GetTextBuffer(Byval lpByte As BytePtr)
についてです。
引数にByValの指定があるときは、その変数のオリジナルではなくコピーを関数内部で扱います。
ですので、例えばこの関数の中で

コード: 全て選択

lpByte=0
のようなコードを実行しても関数から出る時には無効化されてしまいます。
一方、引数にByRefの指定があるときは、オリジナルを関数内部で扱います。
ですので、例えばlpByteにByRefの指定があるとき、

コード: 全て選択

lpByte=0
のようなコードを実行すると、関数から出ても値が引き継がれます。
省略された時にはByValの指定がかかります。

次に

コード: 全て選択

lpByte(0)=0
としていますが、これは実際にはByteArray配列の先頭の要素に0を代入しています。
なぜそんなことが可能になるかと言うと、まず

コード: 全て選択

GetTextBuffer(ByteArray)
と書いてあるように、ByteArray配列の先頭の要素へのアドレスを関数に投げています。
そして次に関数の定義

コード: 全て選択

Sub GetTextBuffer(ByVal lpByte As BytePtr)
により、lpByteに、関数に投げられたByteArray配列の先頭の要素へのアドレスが代入されます。
lpByteはByte型配列の先頭の要素へのアドレスを格納したポインタとしてこの関数内部で扱われることになります。
最後に

コード: 全て選択

lpByte(0)=0
により、lpByteが指すアドレスを基点として0番目のアドレスに(つまりByteArray配列の先頭の要素に)、0が代入されます。

最後。

コード: 全て選択

Dim ByteArray(100) As Byte
で型にByteを使う理由は、現在ABでは文字コードにShift-JISを使用していて、
これは基本的に1バイト単位で記録する文字コードとなっています。
ですので、文字列を扱う場合には1バイト単位で扱うByte型やChar型を使う方が都合がいいんです。
(100)の部分は配列として宣言する為の指定ですね。

初心者の質問です(ポインタについて)

by CrotchetMan » 2008年12月06日(土) 14:17

どうもはじめまして
CrotchetManです
この場を借りて質問させていただきます

コード: 全て選択


Sub GetTextBuffer(ByVal lpByte As BytePtr)
	lpByte(0) = 0
	lstrcat(lpByte,Ex"一行目に表示される文字列\n\r")
	lstrcat(lpByte,"こっちは二行目")
End Sub

Dim ByteArray(100) As Byte
GetTextBuffer(ByteArray)

MessageBox(0,ByteArray,"test",0)
というコードがActiveBasicオフィシャルユーザーズガイドにあったのですが、
このコードの疑問について質問させていただきます。

コード: 全て選択

Sub GetTextBuffer(Byval lpByte As BytePtr)
一行目のこのコードで、
ByValというのがあるのですが、
ByRefと同様、変数lpByteのアドレスを変数ByteArrayに渡しているのですか?

コード: 全て選択

lpByte(0)=0
これはlpByteの先頭のアドレスに0を代入しているんですか?

コード: 全て選択

Dim ByteArray(100) As Byte
1.型にByteを使うのはなぜなんですか?
2.(100)は配列ですか?

長い疑問に対する質問を読んで下さってありがとうございます。
詳しい方、ご教授お願いいたします。

ページトップ