- 【QBASIC互換!?】FreeBasic【GPL】
789 :デフォルトの名無しさん[]:2016/10/09(日) 14:43:10.03 ID:jP/U8Kom - IF 文の比較演算子の解釈に注意。
IF (DispStyleUlong = SS_CENTERIMAGE OR SS_ICON) then と書いたらば、 DispStyleUlong = SS_CENTERIMAGE の場合と SS_ICON の場合が、Then 以降実行された。つまり、 (DispStyleUlong = SS_CENTERIMAGE) OR (SS_ICON) と解釈された。こっちが考えていた、 SS_CENTERIMAGE と SS_ICONとの論理和の結果がDispStyleUlongと等しい場合 には、 IF (DispStyleUlong = (SS_CENTERIMAGE OR SS_ICON)) then のように、()をつけて先に演算させる必要がある。 比較演算子と論理演算子の解釈の順番が違っていたみたい。 なお、SS_ICON と SS_がついているとおり、システム定数(型は不明)で、論理型の変数ではないから。
| - 【QBASIC互換!?】FreeBasic【GPL】
792 :デフォルトの名無しさん[]:2016/10/09(日) 18:25:53.63 ID:jP/U8Kom - Select case 文で、End Select を忘れると、訳の分からないエラーメッセージの羅列が発生する。
Disp06.bas(147) error 35: Expected 'END SELECT', found 'end' in 'end function' Disp06.bas(149) error 60: Illegal inside functions, found 'Function' in 'Function WndProc(ByVal hWin As HWND,ByVal uMsg As UINT,ByVal wParam As WPARAM,ByVal lParam As LPARAM) As Integer' Disp06.bas(270) error 60: Illegal inside functions, found 'Function' in 'Function WinMain(ByVal hInst As HINSTANCE,ByVal hPrevInst As HINSTANCE,ByVal CmdLine As ZString ptr,ByVal CmdShow As Integer) As Integer' Disp06.bas(305) error 41: Variable not declared, WinMain in 'WinMain(hInstance,NULL,CommandLine,SW_SHOWDEFAULT)' Disp06.bas(309) error 35: Expected 'END SELECT' in 'End'
| - 【QBASIC互換!?】FreeBasic【GPL】
793 :デフォルトの名無しさん[]:2016/10/09(日) 18:54:04.23 ID:jP/U8Kom - >>790-791 処理系の違いってけっこうあるんだね。
http://makoto-watanabe.main.jp/freebasic/OpPrecedence.html の「最も高い優先順位」の表をみると、上から、算術演算子、比較演算子、論理演算子、の順番になっている。細かいことを覚えないで、群で覚えていた。 数値型変数と数値型定数の演算だから、「OR」を算術演算子と解釈したのが混乱の原因だった。 「OR」を論理演算子、As BOOLEAN 型変数同士の演算の場合、と、As ULong 型変数(数値型変数)の演算の場合で区別してくれると、勘違いしていた。 MS-DOS のバージョンの変遷だったか、何かのライブラリーの変遷だったか、覚えていないが 障害発生時の分岐を JC でやるか、JNZ でやるか、の処理で問題になった時がある。 製造元では、OR AX,AX JNZ で処理していてので、問題なかったんだが、ユーザーの方で JC でやっていた(1マシンサイクル早い)人がいたので問題になった。 バージョンアップで NC(キャリーフラグに0が定義されている状態)でも正常終了するようにかわったのが直接の原因。
| - 【QBASIC互換!?】FreeBasic【GPL】
795 :デフォルトの名無しさん[]:2016/10/09(日) 21:35:11.73 ID:jP/U8Kom - >>794
>らビット演算子として動作し 型宣言を覚えていないけど、ビット型変数、バイト型変数、ワイド(2バイト)型変数、ダブルワイド(4バイト)型変数があって、 これらの変数に限って、論理演算子(AND, OR, NOT, XOR, XNOR)が使えた。 比較演算子 (.lt., .LE., .EQ., .NE., .GT., .GE.)の結果は、2バイトの領域をもつワイド型変数として、-1,0,+1 のいずれがの値となる。 IF (数値変数) Goto (ラベル1), (ラベル2), (ラベル3) (算術IF文)でJmp (Goto)先が決まった。 という頃の名残。Fotran 6の資産が結構生き残っていた。 論理演算の値は常に正数になるので、負数桁を読み捨てて、0か1になる。 型を無視した処理をやらない限りは負数にならない。 0000かFFFFかという演算ではなくて、00(中略)00か00(中略)01かの1バイトしか見ない。 という頃の話。 >前者が&や|、後者が&&や||ね この演算子は知りません。 C/C++ は持っているけど、自分で描けなかった。 >ビット演算子 これは、論理演算子と同じく AND, OR, NOR, XOR, XNOR があるのだが、 対象がビット型変数、1ワードの最下位1ビットのみを使った変数、に使う演算子で、 2進法の1桁のみの場合。 論理演算子(1ワード16ビット全体)とほぼ同じ名称なんだけど、1文字余計な語(忘却)が付く。 1回も使ったことがない。 「整数型」「8進型」(型を無視するスイッチを指定すれば実数型も使用可能、実数型の指数部を切り離して不定長実数にするという手法もあった)の場合には、論理演算子 「ビット型」の場合には、ビット演算子(2進演算子) C言語と使っていたFotranの方言(Jis 規格外演算)の用語の違いと思います。
|
|