クラスのOperator()

返信する


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

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

トピックのレビュー
   

展開ビュー トピックのレビュー: クラスのOperator()

by マティ » 2006年10月15日(日) 10:37

TrueFalse の判定についてですが

True は言語により -1 , 1 , 0以外 のように色々癖がありますが、Falseは(基本的に) 0 です。

If文で簡単に調べることができます。

コード: 全て選択

If  A  Then  Print "TRUE"  else  Print "FALSE"
Aに代入する値が0以外では TRUE になるのであまり意味がありません。

今回の問題は、If( a )Then で

コード: 全て選択


    Function Operator() As Long
        Return Num
    End Function
の呼び出しが無いことだと思うのですが・・・

by hira » 2006年10月11日(水) 23:30

ご報告ありがとうございます。
しかし x = Not (a As Long) とするとやはりうまく動作しているようですね。
ということは、やはりABのその辺りの実装が関係しているということでいいのでしょうか…。

by Sinryow » 2006年10月11日(水) 03:26

ABの、ただの論理値のtrueは-1です。

コード: 全て選択

Print 1 < 3 ' 「-1」と表示
「TRUE=1」である理由は、TRUEはあくまでWinAPIで定義された定数であり、それに合わせざるを得ないからでしょう。
(もし仮にABにBooleanが正式に導入されれば、C++みたいに小文字の「true」になるような気がします。)


※hiraさんに報告です。

コード: 全て選択

Class Boolean
Private
    Num As Long
Public
    Sub Boolean()
        Num=0
    End Sub

    Function Operator() As Long
        Return Num
    End Function

    Sub Operator= (Data As Long)
        If Data<>0 Then Num=-1 Else Num=0
    End Sub

    Function Operator== (Data As Long) As Long
        If Data<>0 Then Data=-1
        Return (Data And Num)
    End Function
End Class

Dim a As Boolean
a=10

Dim x As Long
x = Not a
このようにすると、最後の行を実行したとき、「Return Num」の時点でアクセス違反が発生します。(AB5.00β4)

by konisi » 2006年10月07日(土) 21:30

> コンパイラが1bitのBOOL型を提供したほうがいいんじゃないかとか思ったりもします。
多分、それ難しいと思います。
コンピュータが8bit単位でメモリ管理しているし、アセンブリ言語には1bit単位で管理する記述法はあるにはあるんですが、結局シフト演算が必要になったりと、あまり汎用的ではありません。
あと、1bit型の場合の四則演算の後処理の方法とか(Double型から1bit持ってくるのが面倒そうだなっていう理屈)
山本sが頑張ってくれればそれでいいんですが、クラス化して提供した方が移植性とか(例えば、どういう理屈か2bit型で管理したくなったとか。)も高いと思います。

by OverTaker » 2006年10月07日(土) 20:08

もしかすると、と思い、オペレータNotを定義してみると、コンパイルエラーになりませんでした。文法チェック時のバグとも考えられないこともないので、Notの文字を他の文字に変えてみたらコンパイルエラーになったので、Operator Notが定義できるようです。

コード: 全て選択

Function Operator Not () As Boolean
End Function
が、いろいろ試してはみたのですが、このOperator Notが呼ばれることはありませんでした。

何かOperatorのNotにバグがありそうですね。


ところで、BOOL型に関してですが、コンパイラが1bitのBOOL型を提供したほうがいいんじゃないかとか思ったりもします。

by konisi » 2006年10月07日(土) 16:22

そもそも、TRUE値はABでは1だったかと。

コード: 全て選択

#console
Print TRUE
Print FALSE
Sleep(-1)
で、Not関数が-1を掛けて1を引くように出来ているので、どうやら此処(TRUE値の決め方)にも問題がありそうです。


追記

・・・と書いた手前、参照先の文章を読んで随分意味の無いことやったなと思った。

クラスのOperator()

by hira » 2006年10月07日(土) 15:48

コード: 全て選択

Class Boolean
Private
	Num As Long
Public
	Sub Boolean()
		Num=0
	End Sub

	Function Operator() As Long
		Return Num
	End Function

	Sub Operator= (Data As Long)
		If Data<>0 Then Num=-1 Else Num=0
	End Sub

	Function Operator== (Data As Long) As Long
		If Data<>0 Then Data=-1
		Return (Data And Num)
	End Function
End Class

#prompt
Dim a As Boolean
a=10
If Not a Then
	Print "True"
Else
	Print "False"
End If
「Booleanを作ったらいい」という投稿があり、興味があったので自作してみたものです(他の言語の仕様とは異なる部分があるかと思いますが)。
しかし、上のコードを実行したとき、なぜか表示結果は「True」になります。
「If Not a Then」 → 「If Not (a As Long) Then」
こうすると「False」を返してくれます。
ActiveBasicの仕様なのかもしれませんが、調査をお願いします。

ページトップ