ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 07:04

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - 初心者の質問です(ポインタについて)
作成者 メッセージ
  記事の件名:   引用付きで返信する
>ByValが指定されていなくても自動的に指定されるのでプログラムには影響ないということですね?
そうですね。付属ヘルプの「リファレンス」→「言語コプセント」→「関数」→「パラメータ」あたりに古い資料があります。
引用:
Dim 変数[100] As 型 と
Dim 変数(100) As 型 ではどちらも同じ効果なんですか?
(少なくともAB4では)同じ意味になります。
引用:
100と指定した場合、変数[0]~変数[99]までで100個使えるという意味ではなくて、
変数[0]~変数[100]の101使えるという意味になるんですか?
典型的なC系の言語等では0~99になりますが、ActiveBasicでは0~100になります。
引用:
0を代入する意味としては何があるのですか?
初期化か何かですか?
そのすぐ下でlstrcatを使うので、初期化をしている事になります。
lstrcat,lstrcpyを始めとする多くの文字列操作関数は「0終端文字」と呼ばれるタイプの文字列を扱います。
そのため、バッファが空である事を示す為に0を代入しています。
引用:
あともうひとつ疑問があるんですが、
ポインタは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)
投稿記事 Posted: 2008年12月09日(火) 15:48
  記事の件名:  返信ありがとうございます  引用付きで返信する
返事遅れてすみません。
わかりやすい回答ありがとうございました。


> 省略された時には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)でないといけないんですか?
投稿記事 Posted: 2008年12月08日(月) 23:52
  記事の件名:   引用付きで返信する
まず
コード:
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)の部分は配列として宣言する為の指定ですね。
投稿記事 Posted: 2008年12月06日(土) 14:56
  記事の件名:  初心者の質問です(ポインタについて)  引用付きで返信する
どうもはじめまして
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)は配列ですか?

長い疑問に対する質問を読んで下さってありがとうございます。
詳しい方、ご教授お願いいたします。
投稿記事 Posted: 2008年12月06日(土) 14:17

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean