Почему мой вектор выводит меня за пределы диапазона при ошибке в памяти? - PullRequest
0 голосов
/ 03 марта 2020

Как говорится в моем заголовке, у меня проблема с выходом за пределы допустимого диапазона моего кода на C ++. Основой c является то, что я делаю вектор для колоды из 52 карт. После чего я рандомизирую порядок карточек.

Когда я go распечатываю карты одну за другой в терминале, я получаю ошибку вне диапазона для расположения памяти. Вывод дает мне первую карту, но затем ломается.

Из проверки ошибок я знаю, что размер моей колоды равен 1, но я думал, что мой pu sh при создании колоды увеличит размер колоды до 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++;
        }
    }
}

1 Ответ

2 голосов
/ 03 марта 2020

Вам нужно было избавиться от массивов и использовать ссылки. Вектор уже является массивом с изменяемым размером. И ссылка означает использовать псевдоним к оригиналу вместо того, чтобы сделать копию. Если бы вы удалили массив [52] битов, но не использовали ссылки, то он бы скопировал массив в каждую функцию, то есть ваш исходный Deck в main не был бы обновлен.

Плюс, я пришлось продвинуться main до конца. Я не знаю, почему MSV C позволил бы вам использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...