【问题标题】:Creating a global stack variable inside a function in C在 C 中的函数内创建全局堆栈变量
【发布时间】:2017-10-21 01:11:05
【问题描述】:

我正在尝试编写一个终端二十一点游戏,我是 C 编程新手

我想要做的是在一个函数内创建一个全局堆栈,我可以通过一张一张地推入我所有洗牌的牌(52 张牌)。然后,每个玩家可以 pop() 一张或两张牌..堆栈中的牌数减少..

这是我的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "stack.h"

/*  ***********************************************************************  */
/*                            STACK DATASTRUCTURE                           */
/*  ***********************************************************************  */

int stack[52];
void push();
int pop();
void traverse();
int is_empty();
int top_element();
int top = 0;


void push(int value) {
   stack[top] = value;
   top++;
}

int pop() {
   top--;
   return stack[top];
}

void traverse() {
   int d;

   if (top == 0) {
      printf("Stack is empty.\n\n");
      return;
   }

   printf("There are %d elements in stack.\n", top);

   for (d = top - 1; d >= 0; d--)
      printf("%d\n", stack[d]);
   printf("\n");
}

int is_empty() {
   if (top == 0)
      return 1;
   else
      return 0;
}

int top_element() {
   return stack[top-1];
}



/*  ***********************************************************************  */
/*                                MY FUNCTIONS                               */
/*  ***********************************************************************  */


void FYshuffle (int *array, int len) {
    int i, tmp, x;
    for (i=len-1; i>1; i--) {
        x = rand()%i;
        if (x==i) continue;
     /* now swap */
        tmp = array[i];
        array[i] = array[x];
        array[x] = tmp;
    }
}

int shuffleCards(void) {
    int i;
    int c = 0;
    int cards[52] = {1, 2, 3, 4, 5, 6 ,7 ,8 ,9 ,10 ,11 ,12 ,13 ,14 ,15 ,16 ,17,
                    18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
                    33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
                    48, 49, 50, 51, 52};
    int deck[52];

    srand(time(0));
    FYshuffle(cards,52);

    for (i=0; i<52;i++) {
      push(cards[i]); <<<<<<<<<<<<< HERE'S THE PROBLEM, ITS JUST LOCAL STACK! I NEED IT TO BE GLOBAL
      int element;
      element = pop();
      printf("Element removed from stack is %d.\n", element);
    }

    for (i=0;i<52;i++) {
      deck[i] = cards[i];
      printf("%d", deck[c]);
      printf("%s", " ");
      c++;
    }
    return 0;
    /* return deck; */
}


/* recognize suits */
int recognizeSuit(int num) {
  int suite;
  suite = num / 13;
  switch(suite) {
    case 0 :
      printf("Clubs ");
      break;
    case 1 :
      printf("Diamonds ");
      break;
    case 2 :
      printf("Hearts ");
      break;
    case 3 :
      printf("Spades ");
      break;

    default :
      printf("Error ");
  }
}

/* recognize the number */
int recognizeNumber(int num) {
  /* recognize the suit */
  int number;
  number = num % 13 + 1;
  switch(number) {
    case 1 :
      printf("ACE ");
      break;
    case 11 :
      printf("JACK ");
      break;
    case 12 :
      printf("QUEEN ");
      break;
    case 13 :
      printf("KING ");
      break;

    default :
      printf("%d ", number);
  }
}


int main(void) {
  shuffleCards();
  printf(" - ");
  recognizeNumber(2);
  recognizeSuit(2);


  return 0;
}

我只是在代码中写了一个注释来向你们展示问题,我该如何解决?因为当我检查主堆栈时,它是空的..

非常感谢您的帮助!祝你有美好的一天!

【问题讨论】:

  • 为什么不在main 中声明数组int cards[52] 并传递一个指向函数的指针?
  • 当您的程序启动时,全局堆栈[] 为空。在您的第一个循环中,您将一张卡片推入 stack[] 并立即将其再次弹出。所以堆栈又是空的。经过 52 次循环迭代后,stack[] 仍然为空。
  • @user5329483 您应该发布该评论作为答案。
  • @user5329483 啊非常感谢,你刚刚给了我解决方案,下次我会尽量小心!

标签: c stack blackjack


【解决方案1】:

您在代码中实际提到的问题不正确。您声明的堆栈已经是您全局定义的全局堆栈。

您可以直接测试它。这是一个名为pushGlobalStack() 的函数,您可以在其中将值推送到函数中。然后为了检查堆栈是否是全局的,弹出 main 中的值而不是 pushGlobalStack() 函数。您可以检查值是否完全相同。

void PushGlobalStack(){

int cards[52] = {11, 22, 51, 4, 5, 41 ,7 ,8 ,9 ,10 ,1 ,2 ,13 ,14 ,15 ,16    ,17,
                18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
                33, 34, 35, 36, 37, 38, 39, 40, 6, 42, 43, 44, 45, 46, 47,
                48, 49, 50, 4, 3};

for(int i=0; i<52;i++) {

    push(cards[i]);
   }
}

int main(void) {

 //shuffleCards();
 // printf(" - ");
 //recognizeNumber(2);
 //recognizeSuit(2);

 PushGlobalStack();

 for(int i=0; i<52;i++) {

    printf("%d \t", pop());

  }

 printf("\n\n\n");

 return 0;
}

【讨论】:

  • 非常感谢,我已经找到问题所在,感谢您的提示,我会尽快使用!我已经接受了答案作为解决方案
猜你喜欢
  • 2016-05-17
  • 2013-06-27
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2010-11-13
  • 2018-01-22
相关资源
最近更新 更多