🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

1回答

763閲覧

JOI Visual Studio 2019

LANet

総合スコア3

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2020/11/24 13:24

#疑問
joiの第10回日本情報オリンピック 予選 D - 1年生 (A First Grader)
という問題をやっているのですが
以下のコードがVisual Studioで実行するとerrorを起こしてしまいます
ですがjoiのコードテスト(gcc)などで試すと普通に実行できます

原因はなんでしょう?
#コード

c++

1#include <algorithm> 2#include <iostream> 3#include <vector> 4#include <string> 5#include <stack> 6#include <list> 7#include <cmath> 8#include <ctime> 9#include <cstdio> 10using namespace std; 11typedef unsigned long long int ulli; 12typedef long long int lli; 13int add(int); 14int main() { 15 int n; cin >> n; 16 vector<int> v; 17 for (int i = 0; i < n; i++) { 18 int t; cin >> t; 19 v.push_back(t); 20 } 21 int Aend = v[n - 1]; 22 v.pop_back(); 23 vector<vector<ulli>> dp(22, vector<ulli>(n, 0)); 24 dp[v[0]][0]++; 25 for (int i = 0; i < n -1; i++) { 26 for (int j = 0; j <= 20; j++) { 27 if (dp[j][i] != 0) { 28 int Mx = j + v[i + 1]; 29 int Mn = j - v[i + 1]; 30 if (add(Mx) != 100) { 31 dp[Mx][i + 1] += dp[j][i]; 32 } 33 if (add(Mn) != 100) { 34 dp[Mn][i + 1] += dp[j][i]; 35 } 36 } 37 } 38 } 39 cout << dp[Aend][n - 2] << endl; 40 return 0; 41} 42int add(int m) { 43 if (0 > m || m > 20) m = 100; 44 return m; 45}

#エラー
![イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

vector<int> vに対して範囲外アクセスしています。

C++

1 vector<int> v; 2 for (int i = 0; i < n; i++) { 3 int t; cin >> t; 4 v.push_back(t); 5 } 6 int Aend = v[n - 1]; 7 v.pop_back(); // ここで末尾から一つ取り除いているため要素数はn-1、つまりインデックスは0~n-2までが有効 8() 9 for (int i = 0; i < n - 1; i++) { 10 for (int j = 0; j <= 20; j++) { 11 if (dp[j][i] != 0) { 12 int Mx = j + v[i + 1]; // iがn-2の時にv[n-1]、つまり範囲外にアクセスしている

vectoroperator[]at()とは異なり範囲チェックについて規定されておらず、要素数以降にアクセスした場合は未定義動作です。
VisualC++付属のvector実装ではDebugビルド時にはoperator[]も範囲チェックを行っているため、Debug Assertが表示されます。

C++

1 _NODISCARD const _Ty& operator[](const size_type _Pos) const 2 { // subscript nonmutable sequence 3 #if _ITERATOR_DEBUG_LEVEL != 0 4 _STL_VERIFY(_Pos < size(), "vector subscript out of range"); 5 #endif /* _ITERATOR_DEBUG_LEVEL != 0 */ 6 7 return (this->_Myfirst()[_Pos]); 8 }

ですがjoiのコードテスト(gcc)などで試すと普通に実行できます

偶々動いているだけです。

投稿2020/11/24 20:04

編集2020/11/24 20:28
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LANet

2020/11/24 21:56

納得です! ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問