int difiere en el nivel de direccionamiento indirecto del error char

El código es de la Guía para principiantes de Absolute a C, y recibo este error ./BlackJack.c : warning C4047: '==' : 'int' differes in levels of indirection from 'char [2]' cuando lo bash para comstackrlo en Visual Studio. Esta es la función principal de un juego de Blackjack.

La línea es 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; } 

(Actualización): Aquí está el código completo.

 #include  #include  #include  #include  #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  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) && (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; } 

Observe cómo todas sus otras comparaciones tienen comillas simples?

 while (ans == 'Y') 

Allí, estás comparando un solo carácter (que es un número, y por lo tanto comparable a otro número).

En el código que está fallando, por otro lado, estás usando comillas dobles.

 ans == "H" 

Así que estás comparando con una cadena, que es una matriz de caracteres. La matriz tiene dos caracteres para acomodar el terminador nulo .

"H" (entre comillas dobles) es una cadena, no un carácter. Para obtener una constante de caracteres que contiene la letra H , necesita 'H' (entre comillas simples). Por lo tanto, su línea debe leer if( ans == 'H' ) .

Lo que también funcionará es if( ans == "H"[0] ) . Esto comparará ans con el primer carácter (cero) de la cadena "H" .

Estoy de acuerdo en que este es un mensaje increíblemente críptico para un simple error de falta de coincidencia de tipo. La culpa es de los comstackdores C y C. (¿Puedo sugerirle que use un lenguaje más moderno como C # o Java?)

El comstackdor informa sus ans como un int mientras que puede haberlo declarado como un char . (No sé cómo lo ha declarado, porque parece haber omitido su statement del código fuente que publicó). Si eso sucede, es porque el comstackdor convierte implícitamente el char en int al intentar compararlo. algo más.

El comstackdor también informa de su "H" como un char[2] , y puede que no sea inmediatamente obvio por qué: C usa cadenas terminadas en nulo, por lo que el literal “H” se representa como una matriz de 2 caracteres, donde el primer carácter es 'H' y el segundo carácter es el carácter nulo. ( '\0' ).

Y luego el comstackdor murmura algo acerca de los diferentes niveles de indirección en lugar de decirte que los tipos que estás tratando de comparar son incompatibles. Esto se debe a que, al intentar realizar la comparación, el comstackdor considera "H" no como una matriz de caracteres, sino como un puntero al primer carácter de la matriz, pero eso no ayuda, porque lo que termina es un puntero a un personaje, (un nivel de direccionamiento indirecto), mientras que necesita un personaje. (Cero niveles de direccionamiento indirecto).