ポインタについて疑問に思ったので質問させて頂きます。
EditBoxなどから文字列を取得するとき、参考文献(ActiveBasicの本ですが)にはBytePtrを使っていました。
幾度と無く真似てきましたが、関数を自分で作るときに文字列を扱うときがあり、ふと疑問がわきました。
Byte変数。
配列変数にして、そこに文字コードが入っていき、文字が保存されるという勝手な解釈をしています。
Long型などと同じで、ソフト終了時に自動開放される(と思っている)。
BytePtr変数
自分でメモリを確保してこないといけないし、自分で確保した分を開放しないといけない。
その確保したメモリの先頭アドレス(番号?)が保存されて、最後はnull文字で終わる(と思ってる)。
では、
Sub Text(a As BytePtr)
End Sub
のようなものはどう使われているのか?
メモリを確保していなくてもテキストを保存できるし、開放処理もいらない……と思う。
このように、関数の引数としてBytePtr型を使う場合はどのようにしていけばいいのでしょうか。
ご存知のかたいらっしゃいましたらご教授ください。
また、上の勝手な解釈、間違っていましたらそちらも教えていただけると幸いです。
……よくプログラム作れてるなぁ……これで……
ポインター変数の仕組み
ポインター変数の仕組み
>メモリを確保していなくてもテキストを保存できるし、開放処理もいらない……と思う。
>このように、関数の引数としてBytePtr型を使う場合はどのようにしていけばいいのでしょうか。
配列データ全体、構造型データを関数やSUBの引数とした時は、
配列データ全体、構造型データの先頭アドレスを引き継ぎます。
C++やVC++と同じ概念です。
だからそれをそのまま使用すればいいと思います。
下記にByte型のポインタ変数を使用した例を示します。
よろしくお願いします
>このように、関数の引数としてBytePtr型を使う場合はどのようにしていけばいいのでしょうか。
配列データ全体、構造型データを関数やSUBの引数とした時は、
配列データ全体、構造型データの先頭アドレスを引き継ぎます。
C++やVC++と同じ概念です。
だからそれをそのまま使用すればいいと思います。
下記にByte型のポインタ変数を使用した例を示します。
[ここをクリックすると内容が表示されます]
説明がうまくなくてすみません。コード: 全て選択
/****************/
/* TEST-PROGRAM */
/****************/
DIM TEXTA[127] AS Byte
DIM TEXTP AS BytePtr
lstrcpy(TEXTA,"TEXTAをそのままTESTSUBの引数として使用する例")
TESTSUB(TEXTA)
TEXTP = TEXTA 'TEXTAの先頭アドレスを設定
lstrcpy(TEXTP,"TEXTAのアドレスをTEXTPに設定してTESTSUBの引数として使用する例")
TESTSUB(TEXTP)
TEXTP = calloc(100) 'callcで100バイトの領域確保
lstrcpy(TEXTP,"callcで100バイトの領域確保してTESTSUBの引数として使用する例")
TESTSUB(TEXTP)
free(TEXTP) 'callcで確保した領域解放
END
' Byte型配列全体の場合はBytePtrまたは*Byteを指定する
SUB TESTSUB(I1TXT AS BytePtr)
MessageBox(NULL,I1TXT,"TEST-PROGRAM",MB_OK)
END SUB
よろしくお願いします
ご返信ありがとうございます
ご返信ありがとうございます!
サンプル拝見しました!!
Byteは直代入
BytePtrはそのアドレスを取得
って感じですね。
>TEXTP = TEXTA 'TEXTAの先頭アドレスを設定
なるほど、こういうふうにも使えるのですか。
この場合は、TXTPは127Byteまでの文字列になるわけですね。
だいたい理解できました!
ありがとうございました
サンプル拝見しました!!
Byteは直代入
BytePtrはそのアドレスを取得
って感じですね。
>TEXTP = TEXTA 'TEXTAの先頭アドレスを設定
なるほど、こういうふうにも使えるのですか。
この場合は、TXTPは127Byteまでの文字列になるわけですね。
だいたい理解できました!
ありがとうございました
Re: ご返信ありがとうございます
> >TEXTP = TEXTA 'TEXTAの先頭アドレスを設定
> なるほど、こういうふうにも使えるのですか。
> この場合は、TXTPは127Byteまでの文字列になるわけですね。
>
DIM A[127] AS Byte
上記の配列の定義の[]の127はヘルプに記載している通り、配列の個数ではなく配列の添え字の上限値です。
ABでは配列は0から始まるのでDIM A[127] AS Byteの場合は127バイトではなくて128バイトになります。
ちなみにC++やVC++の場合、Char A[127]だと127バイトになります。
ところで提示したソースコードですが水波形さんの64ビット版windows7で問題なくコンパイルと実行できましたか?
よろしくお願いします。
> なるほど、こういうふうにも使えるのですか。
> この場合は、TXTPは127Byteまでの文字列になるわけですね。
>
DIM A[127] AS Byte
上記の配列の定義の[]の127はヘルプに記載している通り、配列の個数ではなく配列の添え字の上限値です。
ABでは配列は0から始まるのでDIM A[127] AS Byteの場合は127バイトではなくて128バイトになります。
ちなみにC++やVC++の場合、Char A[127]だと127バイトになります。
ところで提示したソースコードですが水波形さんの64ビット版windows7で問題なくコンパイルと実行できましたか?
よろしくお願いします。
Re: ご返信ありがとうございます
> DIM A[127] AS Byte
> 上記の配列の定義の[]の127はヘルプに記載している通り、配列の個数ではなく配列の添え字の上限値です。
ん?添え字……?
つまり、文字の終端(NULL文字)が上の場合は、0から数えて128番目にあるということでしょうか?
> ちなみにC++やVC++の場合、Char A[127]だと127バイトになります。
Cでもプログラミングを(学校で)やらされているのですが、Cの配列意味わかりませんね……
ABの癖で、10個の要素を定義しようとしてa[9]としたらエラーでて、a[10]とするとうまくいく。
これは、C++と一緒なのでしょうかね^^;?
> ところで提示したソースコードですが水波形さんの64ビット版windows7で問題なくコンパイルと実行できましたか?
はい、問題なく動きました!
WIN7 64bit home
AB 4.24.00
> 上記の配列の定義の[]の127はヘルプに記載している通り、配列の個数ではなく配列の添え字の上限値です。
ん?添え字……?
つまり、文字の終端(NULL文字)が上の場合は、0から数えて128番目にあるということでしょうか?
> ちなみにC++やVC++の場合、Char A[127]だと127バイトになります。
Cでもプログラミングを(学校で)やらされているのですが、Cの配列意味わかりませんね……
ABの癖で、10個の要素を定義しようとしてa[9]としたらエラーでて、a[10]とするとうまくいく。
これは、C++と一緒なのでしょうかね^^;?
> ところで提示したソースコードですが水波形さんの64ビット版windows7で問題なくコンパイルと実行できましたか?
はい、問題なく動きました!
WIN7 64bit home
AB 4.24.00
Re: ご返信ありがとうございます
> つまり、文字の終端(NULL文字)が上の場合は、0から数えて128番目にあるということでしょうか?
というか最大で128バイトの1バイト系の変数/データの定義です。
別に文字の終端(NULL文字)が0~127番目の任意に場所にあってOKです。
> ABの癖で、10個の要素を定義しようとしてa[9]としたらエラーでて、a[10]とするとうまくいく。
> これは、C++と一緒なのでしょうかね^^;?
はいそのとおりです。
というか最大で128バイトの1バイト系の変数/データの定義です。
別に文字の終端(NULL文字)が0~127番目の任意に場所にあってOKです。
> ABの癖で、10個の要素を定義しようとしてa[9]としたらエラーでて、a[10]とするとうまくいく。
> これは、C++と一緒なのでしょうかね^^;?
はいそのとおりです。