ページ 11

ポインタ値の比較

Posted: 2005年11月21日(月) 20:09
by hira

コード: 全て選択

#N88BASIC
Dim a As String
Dim in As BytePtr,limit As BytePtr
a="1234567890"
in=StrPtr(a)
limit=StrPtr(a)+10
Do
	in=in+1
	Print in
Loop While in<limit
以上のコードで、Print文が1回しか実行されません。
今までは動作していたのですが、これは元々できない仕様のはずだったのでしょうか?
※Loop While in As Long<limit As Long とすれば正常動作します

Posted: 2005年11月21日(月) 23:11
by マティ
hiraさんのコードはあっていると思います。

今回問題となっているのでin<limitの部分です。

本来 < , <= は true になり > , >= は false になるはずですが、

AB4.11.03では、< , <= は false で > , >= は true になっています。

= , <> は正常に判定できるようです。

山本様調査お願いします。

Posted: 2005年11月21日(月) 23:33
by マティ
先ほどの調査結果が間違っていたかも知れません。

どうもActiveBasicの比較処理は
右辺と左辺がBytePtrの場合は文字列として処理を行うようです。

そうすると、この件は仕様上はあっていると思われますので
キャストして使う必要があります。

みなさんは右辺と左辺がBytePtrの場合は文字列となる
仕様に関してどう思います?

Posted: 2005年11月22日(火) 07:45
by イグトランス
> 右辺と左辺がBytePtrの場合は文字列となる仕様

+演算子の場合は両辺ともBytePtrでは文字列とはならないようなのでそれと揃えてほしいです。
どちらかと言うとBytePtr同士の比較演算をポインタ変換にするほうが私は良いと思います。
http://www.discoversoft.net/forum/viewtopic.php?t=459

Posted: 2005年11月23日(水) 02:56
by 山本
イグトランス さんが書きました:+演算子の場合は両辺ともBytePtrでは文字列とはならないようなのでそれと揃えてほしいです。
どちらかと言うとBytePtr同士の比較演算をポインタ変換にするほうが私は良いと思います。
了解しました。ニュアンス的に、ポインタ値同士の演算という捉え方が正しいのかもしれません。

次回のバージョンアップで「左辺、右辺のいずれか、又は両方がString型の場合のみ、文字列比較演算として扱う」という仕様に修正する方向で考えます。