为什么我的向量给了我一个超出范围的内存位置错误? 就像我的标题一样,我在C++中用代码来解决一个范围错误。基本要点是,我正在为52张牌组制作一个向量。之后,我将随机排列卡片的顺序
当我在终端上一张一张地打印卡片时,我得到了一个内存位置超出范围的错误。输出给我第一张卡,但随后断开 通过错误检查,我知道我的牌组大小是1,但我认为在创建牌组时,我的推回会将牌组大小增加到52 我有什么遗漏吗?感谢您的帮助为什么我的向量给了我一个超出范围的内存位置错误? 就像我的标题一样,我在C++中用代码来解决一个范围错误。基本要点是,我正在为52张牌组制作一个向量。之后,我将随机排列卡片的顺序,c++,memory,vector,C++,Memory,Vector,当我在终端上一张一张地打印卡片时,我得到了一个内存位置超出范围的错误。输出给我第一张卡,但随后断开 通过错误检查,我知道我的牌组大小是1,但我认为在创建牌组时,我的推回会将牌组大小增加到52 我有什么遗漏吗?感谢您的帮助 #include <iostream> #include <chrono> #include <random> #include <vector> int main() { srand(time(0));
#include <iostream>
#include <chrono>
#include <random>
#include <vector>
int main() {
srand(time(0));
std::vector <std::string> Deck[52];
CreateDeck(Deck);
ShuffleDeck(Deck);
ShowDeck(Deck);
}
void ShowDeck(std::vector <std::string> Deck[52]) {
for (size_t i = 0; i < 52; i++) {
// Microsoft C++ exception: std::out_of_range at memory location 0x004FF718.
std::cout << Deck->at(i) << ",";
if ((i + 1) % 13 == 0) {
std::cout << "\n" << std::endl;
}
}
}
void ShuffleDeck(std::vector <std::string> Deck[52]) {
//shuffle deck to a randomize order
unsigned seed = rand() % 100;
std::shuffle(Deck, Deck + 52, std::default_random_engine(seed));
std::cout << " Shuffling Deck......." << std::endl;
}
void CreateDeck(std::vector <std::string> Deck[52])
{
//using the arrays below contruct a 52 playing card deck
std::string suit[4] = { "S","C","D","H" };
std::string value[13] = { "A","2","3","4","5","6","7","8","9","10","J","Q","K" };
int x = 0;
for (size_t j = 0; j < 4; j++)
{
for (size_t i = 0; i < 13; i++)
{
Deck[x].push_back("[" + value[i] + suit[j] + "]");
x++;
}
}
}
#包括
#包括
#包括
#包括
int main(){
srand(时间(0));
标准::向量甲板[52];
CreateDeck(Deck);
ShuffleDeck(甲板);
展台(甲板);
}
void ShowDeck(std::vector Deck[52]){
对于(大小i=0;i<52;i++){
//微软C++异常:STD::OutoFixOntRead在内存位置0x00 4FF718。
std::cout at(i)您需要删除数组并使用引用。向量已经是一个可调整大小的数组。引用意味着对原始数组使用别名,而不是制作副本。如果您删除了数组[52]
位,但不使用引用,则它会将数组复制到每个函数中,这意味着您的原始Deck
在main中不会被更新
另外,我不得不将main
移到末尾。我不知道为什么MSVC会让您在顶部使用main,但main中的代码要求先声明其他函数,它们位于底部,因此不会被看到
#include <algorithm>
#include <chrono>
#include <iostream>
#include <random>
#include <vector>
void ShowDeck(const std::vector<std::string> &Deck) {
for (size_t i = 0; i < 52; i++) {
// Microsoft C++ exception: std::out_of_range at memory location 0x004FF718.
std::cout << Deck.at(i) << ",";
if ((i + 1) % 13 == 0) {
std::cout << std::endl;
}
}
}
void ShuffleDeck(std::vector<std::string> &Deck) {
// shuffle deck to a randomize order
unsigned seed = rand() % 100;
std::shuffle(Deck.begin(), Deck.begin() + 52,
std::default_random_engine(seed));
std::cout << " Shuffling Deck......." << std::endl;
}
void CreateDeck(std::vector<std::string> &Deck) {
// using the arrays below contruct a 52 playing card deck
std::string suit[4] = {"S", "C", "D", "H"};
std::string value[13] = {"A", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "J", "Q", "K"};
int x = 0;
for (size_t j = 0; j < 4; j++) {
for (size_t i = 0; i < 13; i++) {
Deck.push_back("[" + value[i] + suit[j] + "]");
x++;
}
}
}
int main() {
srand(time(0));
std::vector<std::string> Deck;
CreateDeck(Deck);
ShuffleDeck(Deck);
ShowDeck(Deck);
}
#包括
#包括
#包括
#包括
#包括
void ShowDeck(const std::vector&Deck){
对于(大小i=0;i<52;i++){
//微软C++异常:STD::OutoFixOntRead在内存位置0x00 4FF718。
std::cout您需要删除数组并使用引用。向量已经是一个可调整大小的数组。引用意味着对原始数组使用别名,而不是制作副本。如果您删除了数组[52]
位,但不使用引用,则它会将数组复制到每个函数中,这意味着您的原始Deck
在main中不会被更新
另外,我不得不将main
移到末尾。我不知道为什么MSVC会让您在顶部使用main,但main中的代码要求先声明其他函数,它们位于底部,因此不会被看到
#include <algorithm>
#include <chrono>
#include <iostream>
#include <random>
#include <vector>
void ShowDeck(const std::vector<std::string> &Deck) {
for (size_t i = 0; i < 52; i++) {
// Microsoft C++ exception: std::out_of_range at memory location 0x004FF718.
std::cout << Deck.at(i) << ",";
if ((i + 1) % 13 == 0) {
std::cout << std::endl;
}
}
}
void ShuffleDeck(std::vector<std::string> &Deck) {
// shuffle deck to a randomize order
unsigned seed = rand() % 100;
std::shuffle(Deck.begin(), Deck.begin() + 52,
std::default_random_engine(seed));
std::cout << " Shuffling Deck......." << std::endl;
}
void CreateDeck(std::vector<std::string> &Deck) {
// using the arrays below contruct a 52 playing card deck
std::string suit[4] = {"S", "C", "D", "H"};
std::string value[13] = {"A", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "J", "Q", "K"};
int x = 0;
for (size_t j = 0; j < 4; j++) {
for (size_t i = 0; i < 13; i++) {
Deck.push_back("[" + value[i] + suit[j] + "]");
x++;
}
}
}
int main() {
srand(time(0));
std::vector<std::string> Deck;
CreateDeck(Deck);
ShuffleDeck(Deck);
ShowDeck(Deck);
}
#包括
#包括
#包括
#包括
#包括
void ShowDeck(const std::vector&Deck){
对于(大小i=0;i<52;i++){
//微软C++异常:STD::OutoFixOntRead在内存位置0x00 4FF718。
std::coutstd::vector Deck[52];
是一个52个向量的数组。如果您想要一个包含52个字符串的向量,请使用std::vector Deck(52);
或std::vector Deck;Deck.resize(52);
是一个包含52个向量的数组。如果您想要包含52个字符串的向量,请使用std::vector Deck(52)
或std::vector deck;deck.resize(52);
可以在CreateDeck
和srand(时间(0))中删除用作数组索引的x
在这里也不需要。好吧,我想我理解你的意思。因此,我的原始代码发送了我的数组Deck的空副本。使用这些对数组Deck内存的引用将考虑我所做的更改,因为我正在更改内存本身是否正确?@Nexusred您的原始代码在没有引用的情况下工作因为C++,如C之前,将数组作为指针指向第一个数组元素。因此,使用52个独立的向量数组,您使用了在主< <代码>中的数组的指针,并且您的函数通过指针指向“<代码>主< /代码>甲板排列”。de>CreateDeck
和srand(时间(0))
在这里也不需要。好吧,我想我理解你的意思。因此,我的原始代码发送了我的数组Deck的空副本。使用这些对数组Deck内存的引用将考虑我所做的更改,因为我正在更改内存本身是否正确?@Nexusred您的原始代码在没有引用的情况下工作ES,因为C++,如C之前,将数组作为指针指向第一个数组元素。因此,使用52个独立的向量数组,您使用了在主< /C>中的数组指针,并且通过指针指向“代码>主< /代码>甲板数组,函数写入了。