ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 07:33

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




新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 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)は配列ですか?

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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年12月06日(土) 14:56 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
まず
コード:
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)の部分は配列として宣言する為の指定ですね。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
投稿記事Posted: 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)でないといけないんですか?


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2008年12月09日(火) 15:48 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
>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)

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 4 件の記事 ] 

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


オンラインデータ

このフォーラムを閲覧中のユーザー: Amazon [Bot], Google [Bot], Semrush [Bot] & ゲスト[14人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

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