以下のソースコードを実行すると
警告 C26451 演算のオーバーフロー: 4 バイトの値に演算子 '' を使用し、結果を 8 バイトの値にキャストしています。オーバーフローを避けるため、演算子 '' を呼び出す前に値を幅の広い型にキャストしてください (io.2)。
という警告が出るのですが、警告の説明を見ても意味が理解できません
__int64型にキャストしてみたりdouble型にキャストしてみたのですが、__int64の方は解決せず、doubleは何故キャストしなければいけないのかわかりません
調べても同じような状況の例が見つからなかったので、
できればキャストせずに解決する方法があればそのほうが良いのですが、警告が出る理由と解決法を教えてください
c++
1 if (select_level < skill_data_[si].max_level) // 最大レベルでなければ 2 DrawFormatStringToHandle(add_x, Define::WIN_H - box_size_y + add_exp_y, col.black, GetFont(font_size), 3 "命中力を %.2f (+%.2f) 増加する\nレベルアップに必要なコイン %d", increase * select_level, increase, (skill_data_[si].coins_level + select_level + 1) * level_up_coins); 4 else DrawFormatStringToHandle(add_x, Define::WIN_H - box_size_y + add_exp_y, col.black, GetFont(font_size), 5 "命中力を %.2f 増加する", increase * select_level); 6 7//上記のここ2か所で警告が出る 8(skill_data_[si].coins_level + select_level + 1) * level_up_coins 9increase * select_level 10 11//下の方はdoubleの方は消えたが__int64は消えなかった 12((__int64)skill_data_[si].coins_level + select_level + 1) * level_up_coins 13(__int64)(skill_data_[si].coins_level + select_level + 1) * level_up_coins 14(double)increase * select_level
クラスのコンストラクタで、変数(配列)を初期化した際に「メンバーは必ず初期化してください」と出るのですが、
以下のコードの様に変なことをせずに警告を消す方法はありますか?
C++
1class test 2{ 3 static constexpr int a = 100; 4 int b[a]; 5 6 test(); 7} 8 9 10test::test() 11{ 12 b[0] = 0; // これがないと警告が出てしまうができれば書きたくない 13 for(int i = 0; i < a; i++) b[i] = 0; 14}
上と少し似ているのですが、Zlibの関数を使用したクラスのコンストラクタで「メンバーを初期化して」エラーが出るのですが、
これも原因が分かりません
press_buf_size_とpress_buffer_が初期化されていないというメッセージが出ます
c++
1class CompressionToStorage 2{ 3 uLong data_buf_size_; // データ用の確保したメモリサイズ 4 uLong press_buf_size_; // 圧縮後データ用の確保したメモリサイズ 5 Bytef* buffer_; // データを保存するメモリのポインタ 6 Bytef* press_buffer_; // 圧縮データを保存するメモリのポインタ 7 uLong write_size_; // 書き込み中のサイズ 8 int use_mode_; // 書き込み(1)と読み込み(2)のどちらの処理を利用しているか 9 10public: 11 CompressionToStorage(size_t Size); 12 ~CompressionToStorage(); 13} 14 15CompressionToStorage::CompressionToStorage(size_t Size) 16{ 17 write_size_ = 0; // 書き込み中サイズの初期化 18 use_mode_ = 0; // 利用モードがまだわからないので初期化する 19 data_buf_size_ = Size; // データのサイズを保存する 20 data_buf_size_ += 2048U; // 少しだけ大きめにメモリを確保する 21 buffer_ = new(std::nothrow) Bytef[data_buf_size_]; // 保存するデータより十分大きいメモリを確保 22 if (buffer_ == nullptr) 23 { 24 ERR_GL("メモリの確保に失敗しました ( size=%lu )", data_buf_size_); // エラーメッセージ 25 return; 26 } 27 28 press_buf_size_ = compressBound(data_buf_size_); // 圧縮に必要なサイズを計算 29 if (data_buf_size_ > press_buf_size_) // 計算結果があっているか確認する 30 { 31 ERR_GL("Press size error (%lu -> %lu)", data_buf_size_, press_buf_size_); // あっていなければエラーメッセージ 32 } 33 34 press_buffer_ = new(std::nothrow) Bytef[press_buf_size_]; // 圧縮後のデータを保存するメモリを確保する 35 if (press_buffer_ == nullptr) 36 { 37 ERR_GL("メモリの確保に失敗しました ( size=%lu )", press_buf_size_); // 確保に失敗すればエラーメッセージ 38 return; 39 } 40};
これも初期化してくださいエラーなのですが、以下のクラスで構造体内の
config_type
value
select_max
の3つの変数を初期化してくださいとエラーを出されますが、意味が分かりません
=0をつければなくなりましたが、構造体の定義で初期化はしたくないので原因と対処方法を教えて欲しいです
c++
1class ConfigScene : public AbstractScene 2{ 3 struct config_t 4 { 5 int config_type; // 動きのタイプ(1はon,off、2は0%~100%) 6 int value; // 保存する値 7 std::string path; // iniファイルのパス 8 std::string section; // セクション 9 std::string key; // キー 10 std::string text; // 表示するテキスト 11 12 std::string select_text[6]; // 複数の選択肢を表示する 13 int select_max; // テキストの選択肢の登録最大数 14 }; 15 16 //std::unique_ptr<BackEffectManager> back_effect_mgr_; 17 std::unique_ptr<SelectBox> select_box_; 18 std::vector<config_t> data_list_; 19 20 int count_; 21 22 void set_pad_config(bool delete_flag = false); // パッドコンフィグを登録する 23 24public: 25 ConfigScene(IOnSceneChangedListener* impl, const Parameter& parameter); 26 virtual ~ConfigScene(); 27 28 bool update() override; 29 void draw() const override; 30};
似たような内容なので、一つの質問にまとめてしまいましたが、一つでも解決方法を教えていただければ嬉しいです
win10 VC++2019 (コミュニティ)でDxライブラリを使用しています
回答3件
あなたの回答
tips
プレビュー