ポインタへのポインタ

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: ポインタへのポインタ

by Sinryow » 2006年1月15日(日) 01:35

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を付けると警告だらけになりますが(爆)

by YS » 2006年1月13日(金) 20:55

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]…
とならないのでしょうか?どうも、すっきりしません。

by hira » 2006年1月12日(木) 19:46

ポインタのポインタは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を付けると警告の嵐になってキャストが面倒になってしまいますが(爆

ポインタへのポインタ

by tak » 2006年1月12日(木) 19:34

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 移行期はこうして乗り切ったぞ」など、経験的な情報もお待ちしております。

ページトップ