クラスのOperator()

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

クラスのOperator()

#1 投稿記事 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の仕様なのかもしれませんが、調査をお願いします。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#2 投稿記事 by konisi »

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

コード: 全て選択

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


追記

・・・と書いた手前、参照先の文章を読んで随分意味の無いことやったなと思った。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
OverTaker
記事: 231
登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県

#3 投稿記事 by OverTaker »

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

コード: 全て選択

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

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


ところで、BOOL型に関してですが、コンパイラが1bitのBOOL型を提供したほうがいいんじゃないかとか思ったりもします。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#4 投稿記事 by konisi »

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

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#5 投稿記事 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)
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#6 投稿記事 by hira »

ご報告ありがとうございます。
しかし x = Not (a As Long) とするとやはりうまく動作しているようですね。
ということは、やはりABのその辺りの実装が関係しているということでいいのでしょうか…。
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#7 投稿記事 by マティ »

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
の呼び出しが無いことだと思うのですが・・・
返信する