2015-11-02 3 views
-4

Я получаю карту/задаю не вызывающую ошибку ошибки отладки в моем коде, и я понятия не имею, как ее исправить, я указал проблему на map.erase в моем Shape :: insert function, но я понятия не имею, как остановить проблему от какой-либо помощи. Спасибо.map/set nousedable после использования map.erase

Если я удаляю функцию стирания, она работает, но мне нужно ее, чтобы стереть элементы с карты, т используется теми функциями, больше

ShapeDraw.h

#ifndef _SHAPE_ 
#define _SHAPE_ 
#include <Windows.h> 
#include <cmath> 
#include <math.h> 
#include <stdlib.h> 
#include <map> 
#include <algorithm> 
#include <cstdlib> 
#include <time.h> 
#include <fstream> 
#include <commdlg.h> 
struct CardData 
{ 
    int _x; 
    int _y; 
    LPCWSTR _filename; 
    int _value; 
    int _suit = 0; //0 - Hearts, 1 - Diamonds, 2 - Spaces, 3 - Clubs 
    bool _face = 0; //0 - Face Down, 1 - Face Up <-- This bit is only used for adding the cards to the stacks and shit 
}; 
struct cardStackList; 
class Shape 
{ 

public: 
    cardStackList *stack[11]; 
    //extern cardStackList *stack[11]; 
    //static HBITMAP mBkg; 
    int g_width = 10; //Default Pen Size is 10, 
    int g_pen = PS_SOLID; 
    int pCountMax = pCount; 
    int pCount = 0; //Painting Count 
    std::map<int, CardData> _cardMatrix; 
    std::map<int, CardData>::iterator _rCardIter; 
    cardStackList* make_stack(); 
    void insert(cardStackList *_stack); 
    void CreateStacks(); 
    cardStackList* remove(cardStackList *_stack); //Remove the top most card 
    cardStackList* search(cardStackList *_stack, int _value, int _suit); 
    void display(cardStackList *_stack); //Draw Cards in descending order 
    Shape() 
    { 
     for (int i = 0; i < 11; i++) 
     { 
      stack[i] = NULL; 
     } 
    } 
}; 
#endif 

ShapeDraw.cpp

#include "ShapeDraw.h" 
struct cardStackList 
{ 
    int _x; 
    int _y; 
    LPCWSTR _filename; 
    int _value; 
    int _suit; 
    struct cardStackList *next; 
    struct cardStackList *prev; 
    bool _face; //0 - Face Down, 1 - Face Up 
}*stack[11]; 
cardStackList* Shape::make_stack() 
{ 
    int i; 
    struct cardStackList *temp; 
    temp = new(struct cardStackList); 
    if (temp == NULL) 
    { 
     return 0; 
    } 
    else 
    { 
     i = rand() % (_cardMatrix.size()); 
     _rCardIter = _cardMatrix.find(i); 
     temp->_x = _rCardIter->second._x; 
     temp->_y = _rCardIter->second._y; 
     temp->_filename = _rCardIter->second._filename; 
     temp->_value = _rCardIter->second._value; 
     temp->_suit = _rCardIter->second._suit; 
     temp->_face = _rCardIter->second._face; 
     temp->next = NULL; 
     temp->prev = NULL; 
     _cardMatrix.erase(_rCardIter); 
     pCount--; 
     pCountMax = _cardMatrix.size() + 1; 
    } 
    return temp; 
} 
void Shape::insert(cardStackList *_stack) 
{ 
    struct cardStackList *temp, *s, *t; 
    temp = make_stack(); 
    s = _stack; 
    t = s; 
    if (_stack == NULL) 
    { 
     _stack = temp; 
     _stack->next = NULL; 
     _stack->prev = NULL; 
    } 
    else 
    { 
     while (s != NULL) 
     { 
      t = s; 
      s = s->next; 
     } 
     s = temp; 
     s->prev = t; 
     s->prev->next = s; 
    } 
} 
cardStackList *Shape::remove(cardStackList *_stack) 
{ 
    struct cardStackList *temp, *t, *return_card; 
    temp = _stack; 
    t = temp; 
    while (temp != NULL) 
    { 
     t = temp; 
     if (temp->next != NULL) 
     { 
      temp = temp->next; 
     } 
     else 
     { 
      temp = t; 
     } 
    } 
    temp = t; 
    return_card = temp->next; 
    temp->next = temp->next->next; 
    temp->next->prev = t; 
    return return_card; 
} 
cardStackList *Shape::search(cardStackList *_stack, int _value, int _suit) 
{ 
    struct cardStackList *temp; 
    temp = _stack; 
    while (temp->_value != _value && temp->_suit != _suit) 
    { 
     if (temp->next != NULL) 
     { 
      temp = temp->next; 
     } 
    } 
    if (temp != NULL) 
    { 
     return temp; 
    } 
    return NULL; //Only reaches this if the _value and _suit does not exist in that specific stack 
} 
void Shape::display(cardStackList *_stack) 
{ 

    struct cardStackList *_slot[11]; 
    /* 
    slots 7 to 10 are the Ace Slots 
    */ 
    for (int i = 0; i <= 10; i++) 
    { 
     _slot[i] = stack[i]; 
    } 
    for (int i = 0; i <= 10; i++) 
    { 
     while (_slot[i] != NULL) 
     { 

     } 
    } 
} 
void Shape::CreateStacks() 
{ 
    for (int i = 0; i < 7; i++) 
    { 
     insert(stack[0]); 
    } 
    for (int i = 0; i < 6; i++) 
    { 
     insert(stack[1]); 
    } 
    for (int i = 0; i < 5; i++) 
    { 
     insert(stack[2]); 
    } 
    for (int i = 0; i < 4; i++) 
    { 
     insert(stack[3]); 
    } 
    for (int i = 0; i < 3; i++) 
    { 
     insert(stack[4]); 
    } 
    for (int i = 0; i < 2; i++) 
    { 
     insert(stack[5]); 
    } 
    for (int i = 0; i < 1; i++) 
    { 
     insert(stack[6]); 
    } 
    //Stuff that creates the 7 stacks here 
} 
+2

Пожалуйста, отправьте сообщение [mcve]. –

ответ

0

Проблема заключается в этой строке:

_rCardIter = _cardMatrix.find(i); 

_cardMatrix представляет собой карту, но i является индексом (число) элементов в пределах карты. Поиск в конечном итоге не сможет найти карту с i-м индексом и вернуть итератор end.

В качестве примера предположим, что ваша матрица начинается с номеров карт 0..51. Первой удаленной картой является 23-я карта, поэтому матрица имеет 51 карточку 0..22 и 24..51. В следующий раз вам снова понадобится 23-я карта. find не обнаружит, что эта карта была удалена, и итератор, который вы получите, будет _cardMatrix.end(), который не может быть разыменован.