ポインタへのポインタ

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
tak
記事: 162
登録日時: 2005年5月31日(火) 07:49

ポインタへのポインタ

#1 投稿記事 by tak »

64-bit 版 ActiveBasic は日々完成度を高めているようで、山本様からも割と頻繁にアナウンスされていますね。
β版の公開が待ち遠しいです。(ウチにはまだ64PC無いんだけどねorz)
その 64-bit プログラミングの大きな改善点は、なんといってもポインタ型のサイズが 64-bitに拡大されることでしょう。
それにより 32-bit の限界である4ギガバイトの壁を克服し、理論最大値16エクサバイトという広大なメモリ空間を存分に使えるようになります。
(普通は 4GB も使わんだろ!なんて言わないでね)

さて、そのポインタについて。
ABには TYPEPtr というポインタ型が組み込まれており、ポインタを扱いたいときは参照先の型に応じて DWordPtr などと指定するのですが、ではポインタへのポインタを扱いたい場合はどのようにすればよいのでしょうか?
というのも、
ポインタ型はすべてDWordからQWordに置き換えられます。ポインタ型データをDWord型変数に代入して演算を行うようなコードはバグの原因になりますので、注意が必要です。
  from here.
とのこと。以前は「ポインタへのポインタ」=「32bit値へのポインタ」=「DWordPtr」が確実に成立していたのですが、今後はこの手法が利用できなくなりそう。。。
(実はこの手法、ライブラリの中でも利用されていてちょっぴりオフィシャルな気分。)

自分でいくらか考えてみたのですがどれも回りくどくて納得がいかず、まだ答えが見つかりません。
僕の思考力ではもう限界のようです。皆様の知恵をお貸しください。
「16-bit -> 32-bit 移行期はこうして乗り切ったぞ」など、経験的な情報もお待ちしております。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#2 投稿記事 by hira »

ポインタのポインタはABで扱いにくいものであります。(^^;;

というのも
http://www.discoversoft.net/forum/viewtopic.php?t=460
↑で私が質問していた件。ポインタのポインタにしようと思って **Byte などと使っても、要素を参照してみるとどうやらこのような表記は *DWord(DWordPtr) と同じになってしまっているようです[もしかすると *ULONG_PTR と同値なのかもしれません。64ビット環境がないのでなんともいえません]。

ということで、私の場合は「*ULONG_PTR」で乗り切っています。
ULONG_PTRは32ビットABでは32ビット、64ビットABでは64ビットの符号なし整数となります。
http://www.discoversoft.net/article/ind ... 226&item=3
※#strictを付けると警告の嵐になってキャストが面倒になってしまいますが(爆
YS
記事: 5
登録日時: 2006年1月07日(土) 22:08
お住まい: 静岡県

#3 投稿記事 by YS »

Dim p As *Integer
このとき、
(ポインタ) p

(Integer型データ) p[0],p[1], p[2]…
(C言語なら) *p ,*(p+1),*(p+2)…

Dim p As **Integer
だと、
(ポインタ) p

(ポインタ)  p[0] p[1] …
↓ ↓
(Integer型データ) p[0][0],p[0][1],p[0][2]…p[1][0],p[1][1],p[1][2]…
とならないのでしょうか?どうも、すっきりしません。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#4 投稿記事 by Sinryow »

Dim p As *Integer
このとき、
(ポインタ) p

(Integer型データ) p[0],p[1], p[2]…
(C言語なら) *p ,*(p+1),*(p+2)…

Dim p As **Integer
だと、
(ポインタ) p

(ポインタ)  p[0] p[1] …
↓ ↓
(Integer型データ) p[0][0],p[0][1],p[0][2]…p[1][0],p[1][1],p[1][2]…
とならないのでしょうか?どうも、すっきりしません。
Cではそうなるのでしょうが,ABではそれがうまくいかないということなのでしょう。
※時間がないので実験していませんが

うまく行かないようなら,例えばポインタの演算を利用して
p[0][0] → GetWord( p[0] )
p[0][1] → GetWord( p[0] + SizeOf( Integer ) )
p[0][2] → GetWord( p[0] + 2 * SizeOf( Integer ) )
p[0][3] → GetWord( p[0] + 3 * SizeOf( Integer ) )
   ・
   ・
   ・
のようにすれば(強硬手段ですが)うまくいきます。

といってもそれでは操作が面倒なので,クラスにしてしまうといいかもしれません。
例えば http://ab.sinryow.net/chart.php を参照して下さい。
※上のライブラリは,#strictを付けると警告だらけになりますが(爆)
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
返信する