トップページ > 記事閲覧
Android版:char型のバグ(解決)
名前:ギウ 日時: 2017/03/23 09:40

お世話になっております。 私の設定がおかしいか、VisualStudio2015のバグだと思うのですが、char型でおかしな動きを見つけました。 ↓を実行すると、if文を通過してしまい、return 0; が実行されます。 ==================== int android_main(void) { char flg = -1; if(flg==-1) return -1; return 0; } ==================== デバッグモードで確認すると、flgには255が入ってました。 Android実機とエミュで同じ結果です。 Windows版の方は普通に return -1; が実行されます。 因みに、↓のように書くと、正常な動きになりました。 ==================== if(flg==(char)-1) ==================== このchar型のバグ、他の皆様の環境では如何でしょうか。 DXライブラリ側でも、もしchar型でマイナスを使ってるとこがあれば、ご確認頂いた方が良いかもしれません。 お手数ですがよろしくお願いいたします。
メンテ

Page: 1 |

Re: Android版:char型のバグ ( No.1 )
名前:サファリ 日時:2017/03/11 20:33

まず、バグでは無いと思います。 (プログラミング経験のある人なら、処理系による"暗黙の了解"です。) 普段は、charと書くと signed char(-128〜+127)で処理されると考えがちですが、変数の型の扱いは処理系にって異なります。 AndroidOSは、char型を unsigend char(0〜+255)として処理している関係で、そうした動作に成るのだと思います。 処理系に依存しないコードを書くなら型の unsigend/signed を確かりと記述したほうが良いと思います。 昔の人のプログラムで、 char flg = -1; //=0xFFの意味 と書かれるのは、char型の8bit全てを'1'する為に書かれたコードです。 だからそれを書いた人は、if(flg == -1){ /* 処理 */ }とは、書かないはずです。 もし書くなら、if(flg & -1){ /* 処理 */ }と書いたはずです。 いろんな所で安易に、char型をフラグ変数の様に扱いがちですが、 これからプログラミングを勉強するのなら止めた方が良い書き方だと思います。
メンテ
Re: Android版:char型のバグ ( No.2 )
名前:ギウ 日時:2017/03/11 21:19

サファリ様 > AndroidOSは、char型を unsigend char(0〜+255)として処理している おお!? そうだったんですね、勉強になりました。 有難うございます! Windowsとコンシューマくらいしかやってこなかったので知りませんでした。
メンテ
Re: Android版:char型のバグ ( No.3 )
名前:ギウ 日時:2017/03/11 22:35

因みに、実際は数値を計算させてました。 chr[n].life -= dmg; // ダメージは1〜3程度、Lifeは20くらい if( chr[n].life < 0 ) chr[n].life = 0; という感じで書いてたらバグったと。
メンテ
Re: Android版:char型のバグ ( No.4 )
名前:サファリ 日時:2017/03/12 02:13

誤記の修正です。 修正前:もし書くなら、if(flg & -1){ /* 処理 */ }と書いたはずです。 修正後:もし書くなら、if((flg ^ 0xff)== 0){ /* 処理 */ }と書いたはず。 ダメージ計算す場合は、元の数値を直接変更せずに一時変数に取って計算するか。 チェックしてから変更する様にした方が、要らないバグを増やさなくて良いですね。 if( chr[n].life <= dmg ) // ライフを0以下の数値にしない為にチェックを先にする。 chr[n].lif = 0; else chr[n].life -= dmg;
メンテ
Re: Android版:char型のバグ ( No.5 )
名前:yumetodo 日時:2017/03/22 16:39

8bitである必要があるのなら、 #include <cstdint> して、std::int8_t / std::uint8_t 型を利用するべきだと思われます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存