HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0105
まるんなvar_100=1|2|4|32 の意味について4解決


まるんな

リンク

2024/1/5(Fri) 17:24:41|NO.100982

お世話になります。度々申し訳ありません。

var_100=1|2|4|32

上記のような値があり利用されているのですが、
このvarはどのような扱いになるのでしょうか?
変数だけ移動してデバッグで確認したら
合計である39の値が入っているようでした。

これはどういう時に利用するものでしょうか?
合計の時は+を使えば良いとおもうのですが、
何か意図があったりするのでしょうか?

質問ばかりで申し訳ありません。

HSPのサイト等も調べましたが、調べ方が下手くそなのか
ifのOR以外見つかりませんでした。
利用する直前で毎回変数宣言?されており、
色んな場所で同じ変数に代入し直していて
値が39以外になることはなさそうでした。
それなら直接39を代入すればいいのにと思ったり…。

他人のソースを読み解かないといけないのですが、
馴染のない書き方をされているため調べ方もわかりません。
お手数をおかけしますが、こういうときの調べ方も分かれば教えていただきたいです。
毎回ご迷惑をおかけするのも申しないので…。
ヘルプに載っていたら申し訳ありません。



この記事に返信する


TOMATO

リンク

2024/1/5(Fri) 17:59:38|NO.100983

変数名の付け方と言い、
HSPの逆コンパイラを使って .exe や .ax からソースを生成しました?
みたいなコードですねと…。(文句を言うべきは前任者かしら)

もともと、以下のようなコードだったのではないかと。

#define FLAG_A 0x0001 #define FLAG_B 0x0002 #define FLAG_C 0x0004 #define FLAG_D 0x0008 #define FLAG_E 0x0010 #define FLAG_F 0x0020 hensu = FLAG_A | FLAG_B | FLAG_C | FLAG_F

んで、コンパイルする際に定数値は処理されてしまうので、


hensu = 1 | 2 | 4 | 32

となってしまうと。



buhio

リンク

2024/1/5(Fri) 19:41:32|NO.100986

これは足し算ではなく論理演算じゃないかな。
憶測ですが、おそらく2進数のビット値として扱っているのではないかと。
2進数と10進数の対比表を検索して、1,2,4、32、39を見てみましょう。
なにやら見えてきませんか??

1or2or4or32=39
orなので、どちらかが1なら1(説明合ってるかな、、、?)

var=1|1;→1 var=1|1|1|2;→3

一つの整数型変数で、フラグ管理ができちゃう奴です。命令の引数にオプションとして指定できる状態が複数ある場合によく使われますね。



GENKI

リンク

2024/1/5(Fri) 22:11:22|NO.100987

HSPというかプログラムでは、整数は2進数で記録されています。(整数以外についてここで説明すると分かりにくくなるだけなので、説明をわかりやすくするため整数だけに絞って説明します。)
人間が直接2進数を書くのは難しすぎるので、普通は10進数や16進数で書いて使います。書き方が違っても同じ整数型の変数に同じデータが入れば同じ値の数値として利用できます。

dec = 39 ; 10進数表記 hex = 0x27 ; 16進数表記 bit = 0b100111 ; 2進数表記 mes dec mes hex mes bit
39 = 0b100111 という関係です。
プログラムでは、整数は2進数で記録され取り扱われるので、論理和(OR)に使用することができます。
論理和(OR)について詳しくはHSP開発wikiのこちらをどうぞ。
https://wiki.hsp.moe/%E5%B0%8F%E3%83%AF%E3%82%B6%EF%BC%8F%E3%83%93%E3%83%83%E3%83%88%E6%93%8D%E4%BD%9C.html#u148a96d

というわけで、「1|2|4|32」で何が起きているかをわかりやすくしてみたのがこちら。

mes "" + 0b000001 mes "" + 0b000010 mes "" + 0b000100 mes "" + 0b100000 mes "" + (0b000001 | 0b000010 | 0b000100 | 0b100000) mes "" + 0b100111
2進数表記だと各桁(ビット)が0と1だけしかないのがよくわかります。
プログラムではこの仕組みを使って、何かが有効になっているか無効になっているかの目印として使用されます。
例えばある桁が1だとビットが立っているので有効、0だとビットが立っていないので無効とかです。
ある桁が1の状態をフラグが立っているとも表現されます。
整数の変数1個は、2進数だと32桁ああります。つまり最大32個のフラグを1個の変数だけでまとめて管理できるので超便利なのです。

「var_100=39」と書いてしまうと、「39」という意味が分かりにくい表現になります。
「var_100=1|2|4|32」と書けば4つのフラグを有効にしているという意味が明確になります。(1,2,4,8,16,32はビットが1つだけ立つと分かっているので。)
しかしそれでも各フラグの意味が分かりにくいので、元々はTOMATOさんの指摘通り「hensu = FLAG_A | FLAG_B | FLAG_C | FLAG_F」のような書き方だったのだと思います。

> 色んな場所で同じ変数に代入し直していて

何かの処理をする前に変数の初期化をしているのだと思います。
作業前に条件をリセットして、前提を整えてから処理を開始したかったのではないかと。


> こういうときの調べ方も分かれば教えていただきたいです。

前任者の仕様書無しプログラムの再利用ですか。2通りあります。

分からない部分はわからないまま、結果としてそういう風に動くものとして使う。元のプログラムにはできるだけ手を加えず、入力内容または出力結果だけに必要な手を加える。短期的には何とかなりますが、将来的には完全に手に負えなくなります。バグも出やすいので慎重に。

作った人と同等以上の技術を持って内容の理解に取り組む。具体的には、同じような動作をするプログラムを自分でも作ってみて比較する。将来的にも安全安心な方法です。

私としては、同じようなものを一度自分で作って見ることをお勧めします。
案外元のものよりいいものができるかもしれませんし。



まるんな

リンク

2024/1/10(Wed) 19:07:56|NO.101003

TOMATO様、buhio様、GENKIさま
回答ありがとうございます!
返信遅れて大変申し訳ありません。

なるほど!
1つの変数でフラグ管理ができる代物だったんですね。
数字の意味は2進数でしたか。2進数自体学生時代に習ってましたがピンと来てませんでした。

前任者が作ったのが社内用の専用ブラウザなのですが、
HSPで作る専用ブラウザについて調べたら
似たようなものを見つけました。
HSPのwikiにあるweb Browserを作ろう というところにあるものかもしれません。
サンプルを落とそうと思ったのですが、なさそうですね。

前任者がツールなくしたとか言って騒いでいたので
もしかしたら逆コンパイル?をしたのかもしれません。

また何かあったら相談させてください!



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100982への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.