我有一个Deck对象(卡片组),它是一个双端队列,实现为双向链表。我希望能够随意改变队列,但是我想要的方式超出了我。所以相反,我选择预先将一个数组指向一个指针,并在事后将它们排入队列。问题是,我现在的代码似乎根本没有初始化指针。
void BuildDeck(Deck* deck) {
Card** cards = new Card*[20];
const size_t MAX_INTEGER_LENGTH = sizeof(int) * 4;
char szPostfix[] = "_Card.bmp";
for(int i = 1; i < 21; i++) {
char path[MAX_INTEGER_LENGTH + sizeof(szPostfix) + 1];
sprintf(path,"%d%s",i, szPostfix);
cards[i-1] = new Card(i,path);
}
ShuffleArray(cards);
for (int i = 0; i < 20; i++) {
deck->PushTop(cards[i]);
}
}
void Swap(Card* a, Card* b) {
Card temp = *a;
*a = *b;
*b = temp;
}
void ShuffleArray(Card** cardArray) {
srand(dbTimer());
for (int i = 0; i < 20; i++)
Swap(cardArray[i],cardArray[rand()%20]);
}
我认为我搞砸的地方是在card[i] = new Card(...)
行,但它看起来不对我。
任何建议都将不胜感激。
免责声明:我知道我应该使用标准库来处理大部分内容,但我正在尝试先自己解决困难问题。这就是我学习的方式。
编辑:我修正了索引问题。现在我只想弄清楚为什么有些图像现在没有画出......:/感谢您的帮助!
答案 0 :(得分:1)
在第一个for循环中,你的起始索引是0,而在第二个for循环中,起始索引是0.这可能是问题。
答案 1 :(得分:1)
您的代码有很多问题
您正在使用1 <= i <= 20
进行循环,但对于包含20个元素的数组,索引来自0 <= index <= 19
。您需要使用cards[i-1] = new Card(i,path);
您正在分配指针数组cards
,但您没有解除分配(内存泄漏)。一旦完成,可以使用delete[] cards;
解除分配,或者只使用基于堆栈的数组Card *cards[20];
,而不是使用new
分配。
您计算MAX_INTEGER_LENGTH
的方式表明您并不真正理解sizeof
的作用。
这就是卡片没有洗牌的原因。你编写了一个交换两个指针的函数,但它交换的指针是函数的局部变量(参数),而不是数组的元素。一种解决方案是通过使用void Swap(Card *& a, Card *& b)
声明交换将参数作为指针引用传递,另一种解决方案是将指针传递给指针(但这需要更复杂的实现语法,因为双重间接,并且还需要改变你调用函数的方式。)
答案 2 :(得分:0)
您的代码:
for(int i = 1; i < 21; i++) {
char path[MAX_INTEGER_LENGTH + sizeof(szPostfix) + 1];
sprintf(path,"%d%s",i, szPostfix);
cards[i] = new Card(i,path);
}
此处循环应从0
开始到20
:
for(int i = 1 ; i < 21; i++) //incorrect - original code
for(int i = 0 ; i < 20; i++) //correct - fix
修复后,您可以使用i+1
代替i
:
sprintf(path,"%d%s",i+1, szPostfix);
cards[i] = new Card(i+1,path);
如果需要的话。