簡體   English   中英

int與char [2]錯誤的間接級別不同

[英]int differs in level of indirection from char[2] error

代碼來自C的絕對入門指南./BlackJack.c<41> : warning C4047: '==' : 'int' differes in levels of indirection from 'char [2]'嘗試時./BlackJack.c<41> : warning C4047: '==' : 'int' differes in levels of indirection from 'char [2]'在Visual Studio中進行編譯。 這是二十一點游戲的主要功能。

第<41>行是if (ans == "H") {

main()
{
    int numCards; /* Equals 52 at the beginneing */
    int cards[52], playerPoints[2], dealerPoints[2], total[2]; 
    /* For user Hit/Stand or     Yes/No response */

    do { initCardsScreen(cards, playerPoints, dealerPoints, total, &numCards);
        dealerGetsCard(&numCards, cards, dealerPoints);
        printf("\n");
        playerGetsCard(&numCards, cards, playerPoints);
        playerGetsCard(&numCards, cards, playerPoints);
        do {
            ans = getAns("Hit or stand (H/S)? ");
            if (ans == "H") { 
                platerGetsCard(&numCards, cards, playerPoints); 
            }
        }
        while ( ans != 'S');
        totalIt(playerPoints, total, PLAYER);
        /* Player's total */
        do {
            dealerGetsCard(&numCards, cards, dealerPoints);
        } while (dealerPoints[ACEHIGH] < 17);
        /* 17: Dealer stop */
        totalIt(dealerPoints, total, DEALER);
        /* Dealer's total */
        findWinner(total);
        ans = getAns("\nPlay again (Y/N)? ");
    } while (ans == 'Y');
    return;
}

(更新):這是完整的代碼。

#include <stdio.h>
#include <time.h>
#include <ctype.h>
#include <stdlib.h>

#define BELL '\a'
#define DEALER 0
#define PLAYER 1

#define ACELOW 0
#define ACEHIGH 1

int askedForName = 0;

/****************************
This program specific prototype
****************************/
void dispTitle(void);
void initCardsScreen(int cards[52], int playerPoints[2], int dealerPoints[2], int total[2], int * numCards);
int dealCard(int * numCards, int cards[52]);
void dispCard(int cardDrawn, int points[2]);
void totalIt(int points[2], int total[2], int who);
void dealerGetsCard(int *numCards, int cards[52], int dealerPoints[2]);
void playerGetsCard(int *numCards, int cards[52], int playerPoints[2]);
char getAns(char mesg[]);
char ans;
void findWinner(int total[2]);


main()
{
    int numCards; /* Equals 52 at the beginneing */
    int cards[52], playerPoints[2], dealerPoints[2], total[2]; /* For user Hit/Stand or Yes/No response */

    do { initCardsScreen(cards, playerPoints, dealerPoints, total, &numCards);
    dealerGetsCard(&numCards, cards, dealerPoints);
    printf("\n");
    playerGetsCard(&numCards, cards, playerPoints);
    playerGetsCard(&numCards, cards, playerPoints);
    do {
        char ans = getAns("Hit or stand (H/S)? ");
        if (ans == "H") { 
            playerGetsCard(&numCards, cards, playerPoints); 
        }
    }
    while ( ans != 'S');
    totalIt(playerPoints, total, PLAYER);
    /* Player's total */
    do {
        dealerGetsCard(&numCards, cards, dealerPoints);
    } while (dealerPoints[ACEHIGH] < 17);
    /* 17: Dealer stop */
    totalIt(dealerPoints, total, DEALER);
    /* Dealer's total */
    findWinner(total);
    ans = getAns("\nPlay again (Y/N)? ");
    } while (ans == 'Y');
    return;
}

void initCardsScreen(int cards[52], int playerPoints[2], int dealerPoints[2], int total[2], int *numCards)
{
    int sub, val=1; /* This function's Work variables */
    char firstName[15]; /* Holds user's first name */
    *numCards = 52; /* Holds running total of number of cards */

    for (sub = 0; sub <= 51; sub++) { /* Counts from 0 to 51 */
        val = (val == 14) ? 1 : val; /* If val is 14 reset to 1 */
        cards[sub] = val;
        val++; }
    for (sub = 0; sub <= 1; sub++) { /* Counts from 0 to 1 */
        playerPoints[sub] = dealerPoints[sub] = total[sub]=0; }
    dispTitle();
    if (askedForName ==0) { /* Name asked for nly once */
        printf("\nWhat is your first name? ");
        scanf_s(" %s", firstName);
        askedForName = 1; /* Don't ask prompt again */
        printf("Ok, %s, get ready for casino action!\n\n", firstName);
        getchar(); /* Discards newline. You can safely */
    }           /* ignore compiler warning here. */
    return;
}

/*** This function gets a card for the player and updates the player's points. ***/
void playerGetsCard(int *numCards, int cards[52], int playerPoints[2])
{
    int newCard;
    newCard = dealCard(numCards, cards);
    printf("You draw: ");
    dispCard(newCard, playerPoints);
}

/*** This function gets a card for the dealer and updates the dealer's poimts. ***/
void dealerGetsCard(int *numCards, int cards[52], int dealerPoints[2])
{
    int newCard;
    newCard = dealCard(numCards, cards);
    printf("The dealer draws: ");
    dispCard(newCard, dealerPoints);
}

/*** This function gets a card from the deck and stores it in either the dealer's or the player's hold of cards ***/
int dealCard(int * numCards, int cards[52])
{
    int cardDrawn, subDraw;
    time_t t; /* Gets time for a random value */
    srand((unsigned int)(time(&t)));  /* Seeds random-number generator */
    subDraw = (rand() % (*numCards)); /* From 0 to numcards */
    cardDrawn = cards[subDraw]; 
    cards[subDraw] = cards[*numCards -1]; /* Puts top card */
    (*numCards); /* in place of drawn one */
    return cardDrawn;
}

/*** Displays the last drawn card and updates points with it. ***/
void dispCard(int cardDrawn, int points[2])
{
    switch (cardDrawn) {
    case(11) : printf("%s\n", "Jack");
        points[ACELOW] += 10;
        points[ACEHIGH] += 10;
        break;
    case(12) : printf("%s\n", "Queen");
        points[ACELOW] += 10;
        points[ACEHIGH] += 10;
        break;
    case(13) : printf("%s\n", "King");
        points[ACELOW] += 10;
        points[ACEHIGH] += 10;
        break;
    default : points[ACELOW] += cardDrawn;
        if (cardDrawn == 1)
        { 
            printf("%s\n", "Ace");
            points[ACEHIGH] += 11;
        }
        else
        {
            points[ACEHIGH] += cardDrawn;
            printf("%d\n", cardDrawn); 
        }
    } return;
}

/*** Figure the total for player or dealer to see who won. This function takes into account the fact that Ace is either 1 or 11. ***/
void totalIt(int points[2], int total[2], int who)
{
    /* The following routine first looks to see if the total points counting Aces as 1 is equal to the total points couning Aces as 11. If so, 
    or if the total points counting Aces as 11 is more than 21, the program uses the total with Aces as 1 only */
    if ((points[ACELOW] == points[ACEHIGH]) || (points[ACEHIGH] > 21)) {
        total[who] = points[ACELOW]; /* Keeps all Aces as 1 */
    }
    else {
        total[who] = points[ACEHIGH]; /* Keeps all Aces as 11 */
    }
    if (who == PLAYER) /* Determines the message printed */ {
        printf("You have a total of %d\n\n", total[PLAYER]);
    }
    else {
        printf("The house stands with a total of %d\n\n", total[DEALER]);
    }
    return;
}

/*** Prints the winning player. ***/
void findWinner(int total[2])
{
    if (total[DEALER] == 21) {
        printf("The house wins.\n");
        return;
    }
    if ((total[DEALER] > 21) && (total[PLAYER] > 21)) { 
        printf("%s", "Nobody wins.\n");
        return;
    }
    if ((total[DEALER] >= total[PLAYER]) && (total[DEALER] < 21)) {
        printf("The house wins.\n");
        return;
    }
    if ((total[PLAYER] > 21) && (total[DEALER] < 21)) {
        printf("The house wins.\n");
        return;
    }
    printf("%s%c", "You win!\n", BELL);
    return;
}

/*** Gets the user's uppercase, single-character response. ***/
char getAns(char mesg[])
{
    char ans;
    printf("%s", mesg); /* Prints the prompt message passed */
    ans = getchar();
    getchar(); /* Discards newline. You can safely ignore compiler warning here. */
    return toupper(ans);
}

/*** Clears everything off the screen. ***/
void dispTitle(void)
{
    int i=0;
    while (i < 25) { /* Clears screen by printing 25 blank lines to 'push off' stuff that
                     might be left over on the screen before this program */
        printf("\n");
        i++;
    }
    printf("\n\n*Step right up to the Blackjack tables*\n\n");
    return;
}

請注意,您所有其他比較中的單引號如何?

while (ans == 'Y')

在那里,您正在比較一個字符(它是一個數字,因此可以與另一個數字比較)。

另一方面,在失敗的代碼中,您使用的是雙引號。

ans == "H"

因此,您正在比較一個字符串,它是一個字符數組。 該數組的長度為兩個字符,以容納空終止符

"H" (雙引號)是字符串,而不是字符。 要獲得包含字母H的字符常量,您需要使用'H' (用單引號引起來)。因此,您的行應讀取if( ans == 'H' )

if( ans == "H"[0] )也將起作用。 這會將ans與字符串"H"的第一個(第零個)字符進行比較。

我同意這是一個簡單的類型不匹配錯誤的神秘消息。 怪罪於C和C編譯器。 (我可以建議您使用一些更現代的語言,例如C#或Java嗎?)

編譯器報告您的ans作為int ,而你可能已經宣布它作為一個char (我不知道您如何聲明它,因為您似乎已經從發布的源代碼中省略了它的聲明。)如果發生這種情況,那是因為編譯器在嘗試與之比較時隱式將char轉換為int 。其他的東西。

編譯器還將您的"H"報告為char[2] ,這可能並不立即顯而易見:C使用空終止字符串,因此文字“ H”表示為2個字符的數組,其中第一個字符是'H' ,第二個字符是空字符。 '\\0' )。

然后,編譯器對不同級別的間接尋址含糊不清,而不是告訴您您嘗試比較的類型不兼容。 那是因為在嘗試執行比較時,編譯器不將"H"視為字符數組,而是作為指向數組第一個字符的指針,但這仍然無濟於事,因為它最終指向的是指針一個字符(一個間接級別),同時需要一個字符。 (間接級別為零。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM