初始化指针数组

时间:2011-10-01 05:26:45

标签: c++ arrays pointers shuffle

我有一个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(...)行,但它看起来不对我。

任何建议都将不胜感激。

免责声明:我知道我应该使用标准库来处理大部分内容,但我正在尝试先自己解决困难问题。这就是我学习的方式。

编辑:我修正了索引问题。现在我只想弄清楚为什么有些图像现在没有画出......:/感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

在第一个for循环中,你的起始索引是0,而在第二个for循环中,起始索引是0.这可能是问题。

答案 1 :(得分:1)

您的代码有很多问题

  1. 您正在使用1 <= i <= 20进行循环,但对于包含20个元素的数组,索引来自0 <= index <= 19。您需要使用cards[i-1] = new Card(i,path);

  2. 您正在分配指针数组cards,但您没有解除分配(内存泄漏)。一旦完成,可以使用delete[] cards;解除分配,或者只使用基于堆栈的数组Card *cards[20];,而不是使用new分配。

  3. 您计算MAX_INTEGER_LENGTH的方式表明您并不真正理解sizeof的作用。

  4. 这就是卡片没有洗牌的原因。你编写了一个交换两个指针的函数,但它交换的指针是函数的局部变量(参数),而不是数组的元素。一种解决方案是通过使用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);

如果需要的话。