teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

追記

2021/03/28 13:46

投稿

tetatetu
tetatetu

スコア26

title CHANGED
File without changes
body CHANGED
@@ -54,4 +54,34 @@
54
54
  どこがおかしいのでしょうか?ご回答よろしくお願い致します。
55
55
 
56
56
  ##追記
57
- 質問文を書いている途中で気付いたのですが、`arr2d`がint型のvectorにしているのに対して、`newarr`はunsigned int型、と、型が違っていてまずいのではないかと思いました。この問題に直接関係あるかはわかりませんが、とりあえず`vector<vector<int>>`から`vector<vector<unsigned int>>`に変更してみようと思います。
57
+ 質問文を書いている途中で気付いたのですが、`arr2d`がint型のvectorにしているのに対して、`newarr`はunsigned int型、と、型が違っていてまずいのではないかと思いました。この問題に直接関係あるかはわかりませんが、とりあえず`vector<vector<int>>`から`vector<vector<unsigned int>>`に変更してみようと思います。
58
+
59
+ ##追追記
60
+ [このサイト]()を見ると、「.size()によって返される値はint型ではなくsize_t型」ということを知ったので、上記のコードの一部を以下のように書き換えました。しかし、問題はそこではなかったようです。(依然として`sizeof(newarr)`の値は8のままです)
61
+ ```
62
+ //unsigned int**型の2次元配列newarrに変換
63
+ size_t sizeOfCSV = arr2d.size();//サイズは1025x1025
64
+ //デバッグ用のcout
65
+ cout << "arr2d size:" << arr2d.size() << " arr2d.at(0).at(0)" << arr2d.at(0).at(0) <<endl;
66
+
67
+ unsigned int** newarr = new unsigned int* [sizeOfCSV];
68
+
69
+ for (size_t k = 0; k < sizeOfCSV; ++k) {
70
+ newarr[k] = new unsigned int[sizeOfCSV];
71
+
72
+ for (size_t i = 0; i < sizeOfCSV; ++i) {
73
+ newarr[k][i] = arr2d.at(k).at(i);
74
+ }
75
+ }
76
+ //デバッグ用のcout
77
+ cout << "newarr size:" << sizeof(newarr) << " newarr[0][0]:" << newarr[0][0] << endl;
78
+
79
+
80
+ return newarr;
81
+ ```
82
+ ## 謎の挙動
83
+ また、試しに、`sizeof(newarr)`の値である8を超える要素`newarr[10][10]`を参照してみたところ、なぜか成功し、普通にcsvに書かれていた値を返しました。ただ、Visual Studioに以下の警告が出ました:
84
+ ```
85
+ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
86
+ 警告 C6385 'newarr' から無効なデータを読み取っています: 読み取り可能なサイズは 'sizeOfCSV*8' バイトですが、'88' バイトを読み取る可能性があります。
87
+ ```

1

mia

2021/03/28 13:46

投稿

tetatetu
tetatetu

スコア26

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