为什么我的向量给了我一个超出范围的内存位置错误? 就像我的标题一样,我在C++中用代码来解决一个范围错误。基本要点是,我正在为52张牌组制作一个向量。之后,我将随机排列卡片的顺序

为什么我的向量给了我一个超出范围的内存位置错误? 就像我的标题一样,我在C++中用代码来解决一个范围错误。基本要点是,我正在为52张牌组制作一个向量。之后,我将随机排列卡片的顺序,c++,memory,vector,C++,Memory,Vector,当我在终端上一张一张地打印卡片时,我得到了一个内存位置超出范围的错误。输出给我第一张卡,但随后断开 通过错误检查,我知道我的牌组大小是1,但我认为在创建牌组时,我的推回会将牌组大小增加到52 我有什么遗漏吗?感谢您的帮助 #include <iostream> #include <chrono> #include <random> #include <vector> int main() { srand(time(0));

当我在终端上一张一张地打印卡片时,我得到了一个内存位置超出范围的错误。输出给我第一张卡,但随后断开

通过错误检查,我知道我的牌组大小是1,但我认为在创建牌组时,我的推回会将牌组大小增加到52

我有什么遗漏吗?感谢您的帮助

#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::cout
std::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>中的数组指针,并且通过指针指向“代码>主< /代码>甲板数组,函数写入了。