ab.com コミュニティ https://www.activebasic.com/forum/ |
|
ポインター変数の仕組み https://www.activebasic.com/forum/viewtopic.php?t=2880 |
ページ 1 / 1 |
作成者: | 水波形 [ 2012年2月29日(水) 00:08 ] |
記事の件名: | ポインター変数の仕組み |
ポインタについて疑問に思ったので質問させて頂きます。 EditBoxなどから文字列を取得するとき、参考文献(ActiveBasicの本ですが)にはBytePtrを使っていました。 幾度と無く真似てきましたが、関数を自分で作るときに文字列を扱うときがあり、ふと疑問がわきました。 Byte変数。 配列変数にして、そこに文字コードが入っていき、文字が保存されるという勝手な解釈をしています。 Long型などと同じで、ソフト終了時に自動開放される(と思っている)。 BytePtr変数 自分でメモリを確保してこないといけないし、自分で確保した分を開放しないといけない。 その確保したメモリの先頭アドレス(番号?)が保存されて、最後はnull文字で終わる(と思ってる)。 では、 Sub Text(a As BytePtr) End Sub のようなものはどう使われているのか? メモリを確保していなくてもテキストを保存できるし、開放処理もいらない……と思う。 このように、関数の引数としてBytePtr型を使う場合はどのようにしていけばいいのでしょうか。 ご存知のかたいらっしゃいましたらご教授ください。 また、上の勝手な解釈、間違っていましたらそちらも教えていただけると幸いです。 ……よくプログラム作れてるなぁ……これで…… |
作成者: | たかせ [ 2012年2月29日(水) 01:02 ] |
記事の件名: | ポインター変数の仕組み |
>メモリを確保していなくてもテキストを保存できるし、開放処理もいらない……と思う。 >このように、関数の引数として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 よろしくお願いします |
作成者: | 水波形 [ 2012年3月03日(土) 13:38 ] |
記事の件名: | ご返信ありがとうございます |
ご返信ありがとうございます! サンプル拝見しました!! Byteは直代入 BytePtrはそのアドレスを取得 って感じですね。 >TEXTP = TEXTA 'TEXTAの先頭アドレスを設定 なるほど、こういうふうにも使えるのですか。 この場合は、TXTPは127Byteまでの文字列になるわけですね。 だいたい理解できました! ありがとうございました |
作成者: | たかせ [ 2012年3月03日(土) 21:58 ] |
記事の件名: | 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で問題なくコンパイルと実行できましたか? よろしくお願いします。 |
作成者: | 水波形 [ 2012年3月04日(日) 02:04 ] |
記事の件名: | 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 |
作成者: | たかせ [ 2012年3月04日(日) 20:09 ] |
記事の件名: | Re: ご返信ありがとうございます |
> つまり、文字の終端(NULL文字)が上の場合は、0から数えて128番目にあるということでしょうか? というか最大で128バイトの1バイト系の変数/データの定義です。 別に文字の終端(NULL文字)が0~127番目の任意に場所にあってOKです。 > ABの癖で、10個の要素を定義しようとしてa[9]としたらエラーでて、a[10]とするとうまくいく。 > これは、C++と一緒なのでしょうかね^^;? はいそのとおりです。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |