ページ 1 / 1
クラスのOperator()
Posted: 2006年10月07日(土) 15:48
by 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
#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の仕様なのかもしれませんが、調査をお願いします。
Posted: 2006年10月07日(土) 16:22
by konisi
そもそも、TRUE値はABでは1だったかと。
コード: 全て選択
#console
Print TRUE
Print FALSE
Sleep(-1)
で、Not関数が-1を掛けて1を引くように出来ているので、どうやら此処(TRUE値の決め方)にも問題がありそうです。
追記
・・・と書いた手前、参照先の文章を読んで随分意味の無いことやったなと思った。
Posted: 2006年10月07日(土) 20:08
by OverTaker
もしかすると、と思い、オペレータNotを定義してみると、コンパイルエラーになりませんでした。文法チェック時のバグとも考えられないこともないので、Notの文字を他の文字に変えてみたらコンパイルエラーになったので、Operator Notが定義できるようです。
コード: 全て選択
Function Operator Not () As Boolean
End Function
が、いろいろ試してはみたのですが、このOperator Notが呼ばれることはありませんでした。
何かOperatorのNotにバグがありそうですね。
ところで、BOOL型に関してですが、コンパイラが1bitのBOOL型を提供したほうがいいんじゃないかとか思ったりもします。
Posted: 2006年10月07日(土) 21:30
by konisi
> コンパイラが1bitのBOOL型を提供したほうがいいんじゃないかとか思ったりもします。
多分、それ難しいと思います。
コンピュータが8bit単位でメモリ管理しているし、アセンブリ言語には1bit単位で管理する記述法はあるにはあるんですが、結局シフト演算が必要になったりと、あまり汎用的ではありません。
あと、1bit型の場合の四則演算の後処理の方法とか(Double型から1bit持ってくるのが面倒そうだなっていう理屈)
山本sが頑張ってくれればそれでいいんですが、クラス化して提供した方が移植性とか(例えば、どういう理屈か2bit型で管理したくなったとか。)も高いと思います。
Posted: 2006年10月11日(水) 03:26
by Sinryow
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)
Posted: 2006年10月11日(水) 23:30
by hira
ご報告ありがとうございます。
しかし x = Not (a As Long) とするとやはりうまく動作しているようですね。
ということは、やはりABのその辺りの実装が関係しているということでいいのでしょうか…。
Posted: 2006年10月15日(日) 10:37
by マティ
True と
False の判定についてですが
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
の呼び出しが無いことだと思うのですが・・・