ページ 11

String Class比較演算

Posted: 2006年9月27日(水) 18:42
by situmon
クラスの定義で

Function Operator== (lpszText As LPSTR) As Long
If lstrcmp(This, lpszText) = 0 Then Return TRUE
End Function

がありますが、

Dim a As String
a = "2"
If a == "1" Then
MsgBox 0, "test", "a", MB_OK
End If
End

このソースで文法エラーが発生します。

Re: String Class比較演算

Posted: 2006年9月27日(水) 19:03
by 7
> このソースで文法エラーが発生します。
正しくは以下のように書きます。

コード: 全て選択

Function Operator== (lpszText As LPSTR) As Long
	If lstrcmp(This, lpszText) = 0 Then Return TRUE
End Function

Dim a As String

	a = "2"
	If a = "1" Then
		MsgBox 0, "test", "a", MB_OK
	End If

	End

Posted: 2006年9月27日(水) 19:08
by situmon
そのつもりで検証してましたが、

Dim a As String
a = "1"
If a = "1" Then
MsgBox 0, "test", "a", MB_OK
End If
If Not(a = "1") Then
MsgBox 0, "test", "a", MB_OK
End If
End

これを実行するとメッセージボックスが2つ出ます。
そこで、クラス定義をみて、'=='で試してもだめだったので報告しました。

追加

Posted: 2006年9月27日(水) 19:38
by situmon
今気づいたけどABでは IF は 0 以外は入るみたいで、
Not は、数値に対して '(数値 + 1) * (-1)' する関係で

コード: 全て選択


If 0 Then
	MsgBox 0, "test", "0", MB_OK '非表示
End If
If 1 Then
	MsgBox 0, "test", "1", MB_OK '表示
End If
If -1 Then
	MsgBox 0, "test", "-1", MB_OK '表示
End If
If Not(0) Then
	MsgBox 0, "test", "Not(0)", MB_OK '表示
End If
If Not(1) Then
	MsgBox 0, "test", "Not(1)", MB_OK '表示
End If
If Not(-1) Then
	MsgBox 0, "test", "Not(-1)", MB_OK '非表示
End If
こういうコードで見るとわかりやすいけど、

コード: 全て選択


Function Operator== (lpszText As LPSTR) As Long 
    If lstrcmp(This, lpszText) = 0 Then Return TRUE 
End Function 
これは

コード: 全て選択


Function Operator== (lpszText As LPSTR) As Long 
    If lstrcmp(This, lpszText) = 0 Then Return -1 
End Function 
このほうが、前の'String型'との互換性が強いかもしれません。
もしくはTRUEの数値を'-1'にするか・・・

Posted: 2006年9月27日(水) 20:26
by NoWest
これは以前からある問題です。

ActiveBasicが真偽値として-1と0を使うのに対し
C言語などのTRUEやFALSEは1と0に対応していますよね。

situmonさんのご指摘どおりActiveBasicのNot算は前者の方に従って
計算されますからTRUEが戻り値として返ると面倒なことになります。


新たにBASIC_TRUEとBASIC_FALSEのようなものを定義して区別するか、
Cのようにtrueとfalseのようなものを定義してそちらを-1と0に対応させるのか、
どちらにしても混乱はますます深まりそうですね。

Posted: 2006年9月27日(水) 22:53
by イグトランス
あるいはCのようにビット演算子と論理演算子を分離するという手もあります。
And, Or, Notに相当する論理演算子は,C/C++のように0か非0かをオペランドに取り,BASIC風に結果を0か-1を返すという具合です。

ますますBASICからは離れていきそうですけどね。

Posted: 2006年9月27日(水) 23:21
by 高信期
bool/Boolean型を作って比較演算は常にそれを帰すようにすればいいのでは?
他のBasic言語ではVisualBasic,PureBasic,REALbasicにはBoolean型があり、
FreeBasicなどには無いようですね。