你好,我正在尝试用 C 语言玩二十一点游戏。当我执行 "deal" 函数时,警告“从不兼容的指针类型传递参数”

Hello, im trying to do a blackjack game , in C. When i do the "deal" funtion the warning 'passing argumente from incompatible pointer type

我正在尝试用 C 语言为学校项目做一个 21 点游戏。当我执行 "Deal_player" 函数时,它会发出警告“从不兼容的指针类型传递参数” 警告出现在第 68 行,我不知道问题是什么。有人可以帮忙吗?

void InitEverything(int , int , TTF_Font **, SDL_Surface **, SDL_Window ** , SDL_Renderer ** );
void InitSDL();
void InitFont();
SDL_Window* CreateWindow(int , int );
SDL_Renderer* CreateRenderer(int , int , SDL_Window *);
int RenderText(int , int , const char* , TTF_Font *, SDL_Color *, SDL_Renderer * );
int RenderLogo(int , int , SDL_Surface *, SDL_Renderer * );
void RenderTable(int [], TTF_Font *, SDL_Surface **, SDL_Renderer * );
void RenderCard(int , int , int , SDL_Surface **, SDL_Renderer * );
void RenderHouseCards(int [], int , SDL_Surface **, SDL_Renderer * );
void RenderPlayerCards(int [][MAX_CARD_HAND], int [], SDL_Surface **, SDL_Renderer * );
void LoadCards(SDL_Surface **);
void UnLoadCards(SDL_Surface **);
void baralhar(SDL_Surface **);
void Deal_player(int**);


    int main( int argc, char* args[] )
    {
        SDL_Window *window = NULL;
        SDL_Renderer *renderer = NULL;
        TTF_Font *serif = NULL;
        SDL_Surface *cards[MAX_DECK_SIZE+1], *imgs[2];
        SDL_Event event;
        int delay = 300;
        int quit = 0;
        int money[MAX_PLAYERS] = {110, 110, 110, 110};
        int player_cards[MAX_PLAYERS][MAX_CARD_HAND] = {{0}};
        int house_cards[MAX_CARD_HAND] = {0};
        int pos_house_hand = 0;
        int pos_player_hand[MAX_PLAYERS] = {0};

        // initialize graphics
        InitEverything(WIDTH_WINDOW, HEIGHT_WINDOW, &serif, imgs, &window, &renderer);
        // loads the cards images
        LoadCards(cards);
        baralhar(cards);
        Deal_player(player_cards); //warning


//deal funtion;


void Deal_player(int **player_card){
    int j, h, k = 0;

    for(j=0; j<MAX_PLAYERS; j++){
        for(h=0; h<MAX_CARD_HAND; h++){
            player_card[j][h] = k;printf("jjjjjjjj\n");
            k++;
        }
    }
    for(j=1; j<=4; j++)
        for(h=0; h<2; h++)
            printf("-----%d\n" ,player_card[j][h]);
    return;
}

Deal_player的参数类型错误。它应该声明为:

void Deal_player(int (*)[MAX_CARD_HAND]);

并定义为:

void Deal_player(int (*player_card)[MAX_CARD_HAND])
{
    /* ... */
}

或者,您可以将其声明为:

void Deal_player(int [][MAX_CARD_HAND]);

并将其定义为:

void Deal_player(int player_card[][MAX_CARD_HAND])
{
    /* ... */
}

虽然替代方案看起来参数是一个二维数组,但编译器会自动将参数的类型更改为指向一维数组的指针。

问题出在int [][]类型和int **类型的区别上。人们往往会混淆这两者。但是数组类型不同于指针类型,尽管它们有时在含义上可能会重叠。

例如对于 int a[MAX_SOMETHING] 类型,sizeof(a)/sizeof(a[0]) 在编译时计算我们的 a 数组中元素的数量。但是对于 int *a = malloc(MAX_SOMETHING*sizeof(int)) 它会产生不同的意外结果(因为 malloc 是在运行时创建的,而 sizeof 是在编译时执行的)。

我很确定还有更多的例子可以表达这两者之间的区别,但这个例子很吸引人。

而是将一个指向数组的指针作为参数发送,并按如下方式更改被调用方的签名:

//caller - take the address
deal_players(&player_cards);    
//callee
void deal_players_ptr_to_arr(int (*arr)[MAX_PLAYERS][MAX_CARDS])

注意 1:如果您对 (*arr) 部分感到困惑,int (*arr)[MAX_PLAYERS][MAX_CARDS] 被读取为指向大小为 MAX_CARDS 的数组的指针 MAX_PLAYERS。

注意 2:您可以在一些漂亮的 players_cards_t 名称中定义那个长类型名称,但它不是 recommended.