質問編集履歴

2

追記

2021/03/28 13:46

投稿

tetatetu
tetatetu

スコア26

test CHANGED
File without changes
test CHANGED
@@ -111,3 +111,63 @@
111
111
  ##追記
112
112
 
113
113
  質問文を書いている途中で気付いたのですが、`arr2d`がint型のvectorにしているのに対して、`newarr`はunsigned int型、と、型が違っていてまずいのではないかと思いました。この問題に直接関係あるかはわかりませんが、とりあえず`vector<vector<int>>`から`vector<vector<unsigned int>>`に変更してみようと思います。
114
+
115
+
116
+
117
+ ##追追記
118
+
119
+ [このサイト]()を見ると、「.size()によって返される値はint型ではなくsize_t型」ということを知ったので、上記のコードの一部を以下のように書き換えました。しかし、問題はそこではなかったようです。(依然として`sizeof(newarr)`の値は8のままです)
120
+
121
+ ```
122
+
123
+ //unsigned int**型の2次元配列newarrに変換
124
+
125
+ size_t sizeOfCSV = arr2d.size();//サイズは1025x1025
126
+
127
+ //デバッグ用のcout
128
+
129
+ cout << "arr2d size:" << arr2d.size() << " arr2d.at(0).at(0)" << arr2d.at(0).at(0) <<endl;
130
+
131
+
132
+
133
+ unsigned int** newarr = new unsigned int* [sizeOfCSV];
134
+
135
+
136
+
137
+ for (size_t k = 0; k < sizeOfCSV; ++k) {
138
+
139
+ newarr[k] = new unsigned int[sizeOfCSV];
140
+
141
+
142
+
143
+ for (size_t i = 0; i < sizeOfCSV; ++i) {
144
+
145
+ newarr[k][i] = arr2d.at(k).at(i);
146
+
147
+ }
148
+
149
+ }
150
+
151
+ //デバッグ用のcout
152
+
153
+ cout << "newarr size:" << sizeof(newarr) << " newarr[0][0]:" << newarr[0][0] << endl;
154
+
155
+
156
+
157
+
158
+
159
+ return newarr;
160
+
161
+ ```
162
+
163
+ ## 謎の挙動
164
+
165
+ また、試しに、`sizeof(newarr)`の値である8を超える要素`newarr[10][10]`を参照してみたところ、なぜか成功し、普通にcsvに書かれていた値を返しました。ただ、Visual Studioに以下の警告が出ました:
166
+
167
+ ```
168
+
169
+ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
170
+
171
+ 警告 C6385 'newarr' から無効なデータを読み取っています: 読み取り可能なサイズは 'sizeOfCSV*8' バイトですが、'88' バイトを読み取る可能性があります。
172
+
173
+ ```

1

mia

2021/03/28 13:46

投稿

tetatetu
tetatetu

スコア26

test CHANGED
@@ -1 +1 @@
1
- vector<vector int>型配列からunsigned int**型配列への変換に失敗してしまう
1
+ int型のvectorからunsigned int**型配列への変換に失敗してしまう
test CHANGED
File without changes