无法使用函数更改数组中的元素

时间:2018-10-26 19:09:43

标签: c++

我一直在为学校开发扑克游戏的项目。我有随机生成卡的代码,但是在使用函数对它们进行排序时遇到问题。我相信算法本身可以工作,但是我不确定如何正确访问数组中的变量。 Visual Studio给我错误argument of type "int (*)[5]与类型int *(*)[5]'void sortPokerHand(int *[][5])': cannot convert argument 1 from 'int [2][5]' to 'int *[][5]'的参数不兼容。

main()中的pokerHand声明

int pokerHand[2][5];

我的功能

//swap the two values
void swap(int* pokerHand, int* x, int* y)
{
  int tempVal = pokerHand[0][x];
  int tempSuit = pokerHand[1][x];
  pokerHand[0][x] = pokerHand[0][y];
  pokerHand[1][x] = pokerHand[1][y];
  pokerHand[0][y] = tempVal;
  pokerHand[1][y] = tempSuit;
}

void sortPokerHand(int* pokerHand[2][5])
{
   //bubble sort poker hand
   bool swapped;
   for (int i = 0; i < 4; i++)
   {
      swapped = false;
      for (int j = 0; j < (5 - i - 1); j++)
      {
        if (pokerHand[0][j] > pokerHand[0][j + 1])
        {
            swap(pokerHand[2][5], pokerHand[0][j], pokerHand[0][j + 1]);
            swapped = true;
        }
      }

      // If no two elements were swapped by inner loop, then break 
      if (swapped == false)
        break;
   }
}

我如何尝试使用该功能

sortPokerHand(pokerHand);

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

您正在做的事情比应做的要困难得多。请考虑以下先决条件:

  • “手”是五个int值的序列
  • 仅单手牌相对于彼此排序。

鉴于此,您的swap例程是完全错误的。它应按地址占用两个int(因此,指向int的指针),并使用它们来交换内容:

void swapInt(int *left, int *right)
{
    int tmp = *left;
    *left = *right;
    *right = tmp;
}

接下来,在排序时,我们正在对手进行排序。这意味着由五个int组成的单个序列。因此,无需传递数组数组,指向数组的指针,指针数组或任何其他方法。做到这一点,干净又基本:

// assumption: a hand has five cards
void sortPokerHand(int hand[])
{
    // bubble sort sequence of int
    size_t len = 5;
    bool swapped = true;
    while (swapped && len-- > 0)
    {
        swapped = false;
        for (size_t i = 0; i < len; ++i)
        {
            if (hand[i] > hand[i + 1])
            {
                swapInt(hand + i, hand + i + 1); // note: uses our new swap function
                swapped = true;
            }
        }
    }
}

最后,我们需要一些帮助,都需要排序。为了这个示例,我在main()中将它们声明为数组的内联数组,然后进行两次调用以对它们进行实际排序,一次调用一次。首先,我们需要一个打印功能:

void printHand(const int hand[])
{
    fputc('{', stdout);
    for (size_t i = 0; i < 5; ++i)
        printf("%d ", hand[i]);
    puts("}");
}

足够简单。现在main()

int main()
{
    int  hands[2][5] = 
    {
        { 5,10,7,4,1 },
        { 3,6,8,2,9 }
    };

    for (size_t i = 0; i < 2; ++i)
    {
        sortPokerHand(hands[i]);
        printHand(hands[i]);
    }

    return EXIT_SUCCESS;
}

该程序的输出为:

{1 4 5 7 10 }
{2 3 6 8 9 }

完全符合我们的预期。

就是这样。在更一般的解决方案中,我们将具有任​​意大小,必须通过排序和打印功能来波动,以确保完整而正确的活动。知道它是静态大小5会使它变得容易一些。

还请注意,您可以完全更改hands的定义,以使用指向数组的指针,而不是使用数组数组,甚至不使用指向指针的指针,只要它能够sortHand和/或printHand指向int*,指向五个int值。

答案 1 :(得分:0)

真正的问题是,首先您将如何获得类似int *pokerHand[2][5]之类的东西。

C ++的优点之一是相当丰富的类型系统。如果这样做,我可能会先定义卡的类型:

class card {
    enum { clubs, diamonds, spades, hearts } suit;
    int value; // 1-13 = Ace - King
public:
    bool operator<(card const &other) { 
        if (suit < other.suit)
            return true;
        if (other.suit < suit)
            return false;
        return value < other. value;
    }
};

因此,operator<首先按西装排序,然后按西装中的值排序,因此同一西装中的所有纸牌将一起排序。

从那里开始,一副扑克牌通常将是五张牌,所以我们只有:

std::vector<card> poker_hand;

对手进行排序类似于:

std::sort(poker_hand.begin(), poker_hand.end());

如果您想编写自己的排序例程,显然可以,但是最终还是很简单的-卡的一维向量,您可以直接对其进行比较,例如:

if (secondCard < firstCard) 
    swap(secondCard, firstCard);

答案 2 :(得分:-1)

将int * pokerHand [2] [5]更改为int ** pokerHand。