【发布时间】:2011-10-01 05:26:45
【问题描述】:
我有一个 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(...) 行,但它在我看来是正确的。
任何建议将不胜感激。
免责声明:我知道我应该使用标准库来处理大部分这些东西,但我想先自学那些难的东西。这正是我学习的方式。
编辑:我修复了索引问题。现在我只是想弄清楚为什么有些图像现在没有绘制...:/感谢您的帮助!
【问题讨论】:
-
对于固定大小的数组,您必须使用自动对象(即
Card card[10][20];)。new应该仅在您确实需要动态分配时使用。 -
您的
swap例程会比void swap(Card *&a, Card *&b) { Card *tmp = a; a = b; b = tmp; }更好,以节省大量不必要的数据复制。 -
那个交换修正修复它!谢谢!
标签: c++ arrays pointers shuffle