Thread: Control may reach end of non-void function - 3 Warnings

  1. #1
    Registered User
    Join Date
    May 2016
    Posts
    6

    Question Control may reach end of non-void function - 3 Warnings

    Hey guys, I'm trying to make this Draw Poker program work, but I keep getting three warnings and they are I believe related to:

    Code:
    char getSuit(int suit) {
    	switch (suit) {
    		case 0: return('c'); 
    		case 1: return('d'); 
    		case 2: return('h'); 
    		case 3: return('s'); 
    	}
    }
    and...

    Code:
    char getRank(int rank) {
    	switch (rank) {
    		case 0: return('A'); 
    		case 1: return('2'); 
    		case 2: return('3'); 
    		case 3: return('4'); 
    		case 4: return('5'); 
    		case 5: return('6'); 
    		case 6: return('7'); 
    		case 7: return('8'); 
    		case 8: return('9'); 
    		case 9: return('T'); 
    		case 10: return('J'); 
    		case 11: return('Q'); 
    		case 12: return('K'); 
    	}
    }
    I think I need a return with a value after the switches but don't know what?

    Also getting error for the following?

    Code:
    do {
    		printf("How much do you want to bet? (Enter a number 1 to 5, or 0 to quit the game): "); 
    		scanf(" %d", &bet); 
    		if (bet >= 1 && bet <= 5) {
    			return(bet); 
    		}
    		else if (bet == 0) {
    			exit(1); 
    		}
    		else {
    			printf("\n\nPlease enter a bet from 1-5 or 0 to quit the game.\n"); 
    		}
    	}
    	while ((bet < 0) || (bet > 5)); 
    }
    Here's the full source code for the Draw Poker program:

    Code:
    // Draw Poker Program 
    /* This program plays draw poker. Users can play as often as they want, betting between 1 and 5. They are dealt 
    	5 cards and then get to choose which cards to keep, and which cards to replace. The new hand is then reviewed 
    	and the user's payout is set based on the value of the hand. The user's new bankroll is displayed as they are 
    	given the option to continue. */
    
    
    // Header files
    #include <stdio.h>
    #include <time.h>
    #include <ctype.h>
    #include <stdlib.h>
    
    
    // Two constants defined for determining whether hands are flushes or straights
    #define FALSE 0
    #define TRUE 1
    
    
    // Function prototyping
    void printGreeting(); 
    int getBet(); 
    char getSuit(int suit); 
    char getRank(int rank); 
    void getFirstHand(int cardRank[], int cardSuit[]); 
    void getFinalHand(int cardRank[], int cardSuit[], int finalRank[], int finalSuit[], int ranksinHand[], int suitsinHand[]); 
    int analyzeHand(int ranksinHand[], int suitsinHand[]); 
    
    
    int main() {
    
    
      int bet; 
      int bank = 100; 
      int i; 
      int cardRank[5]; // Will be one of 13 values (Ace-King)
      int cardSuit[5]; // Will be one of 4 values (for Clubs, Diamonds, Hearts, Spades
      int finalRank[5]; 
      int finalSuit[5]; 
      int ranksinHand[13]; // Used for evaluating the final hand
      int suitsinHand[4]; // Used for evaluating the final hand
      int winnings; 
      time_t t; 
      char suit, rank, stillPlay; 
    
    
      /* This function is called outside the do...while loop because the greeting only needs to be displayed once, while 
      everything else in main will run multiple times, depending on how many times the user wants to play. */ 
    
    
      printGreeting(); 
    
    
      // Loop runs each time the user plays a hand of draw poker
      do {
      	bet = getBet(); 
      	srand(time(&t)); 
      	getFirstHand(cardRank, cardSuit); 
      	printf("Your five cards: \n"); 
      	for (i = 0; i < 5; i++) {
      		suit = getSuit(cardSuit[i]); 
      		rank = getRank(cardRank[i]); 
      		printf("Card #%d: %c%c\n", i+1, rank, suit); 
      	}
      	/* These two arrays are used to figure out the value of the player's hand. However, they must be zeroed out in 
      	case the user plays multiple hands. */
      	for (i = 0; i < 4; i++) {
      		suitsinHand[i] = 0; 
      	}
      	for (i = 0; i < 13; i++) {
      		ranksinHand[i] = 0; 
      	}
    
    
      	getFinalHand(cardRank, cardSuit, finalRank, finalSuit, ranksinHand, suitsinHand); 
      	printf("Your five final cards: \n"); 
      	for (i = 0; i < 5; i++) {
      		suit = getSuit(finalSuit[i]); 
      		rank = getRank(finalRank[i]); 
      		printf("Card #%d: %c%c\n", i+1, rank, suit); 
      	}
      	winnings = analyzeHand(ranksinHand, suitsinHand); 
      	printf("You won %d!\n", bet*winnings); 
      	bank = bank - bet + (bet*winnings); 
      	printf("\nYour bank is now %d.\n", bank); 
      	printf("\nDo you want to play again? "); 
      	scanf(" %c", &stillPlay); 
      }	
      	while (toupper(stillPlay) == 'Y'); 
    
    
    return 0; 
    
    
    }
    /***********************************************************************************************/
    // Print a quick greeting as well as tell the users the value of different winning hands.
    void printGreeting() {
    	printf("\n\nWelcome to Alex's Casino\n\n"); 
    	printf("Here are the rules:\n"); 
    	printf("You start with 100 credits, and you make a bet from 1 to 5 credits. You are dealth 5 cards, and "); 
    	printf("you then choose which cards to keep or discard. You want to make the best possible hand. Here is "); 
    	printf("the table for winnings (assuming a bet of 1 credit): "); 
    	printf("\nPair\t\t\t\t1 credit"); 
    	printf("\nTwo Pairs\t\t\t\t2 credit2"); 
    	printf("\nThree of a Kind\t\t\t\t3 credits"); 
    	printf("\nStraight\t\t\t\t4 credits"); 
    	printf("\nFlush\t\t\t\t5 credits"); 
    	printf("\nFull House\t\t\t\t8 credits"); 
    	printf("\nFour of a Kind\t\t\t\t10 credits"); 
    	printf("\nStraight Flush\t\t\t\t20 credits"); 
    	printf("\n\nHave fun!\n\n"); 
    }
    // Function to deal the first five cards
    void getFirstHand(int cardRank[], int cardSuit[]) {
    	int i, j; 
    	int cardDup; 
    
    
    	for (i = 0; i < 5; i++) {
    		cardDup = 0; 
    		do {
    			// Card rank is one of 13 (2-10, J, Q, K, A)
    			cardRank[i] = (rand() % 13); 
    			// Card suit is one of 4 (club, diamond, heart, spade)
    			cardSuit[i] = (rand() % 4); 
    
    
    			// Loop that ensures each card is unique
    			for (j = 0; j < i; j++) {
    				if ((cardRank[i] == cardSuit[j]) && (cardSuit[i] == cardSuit[j])) {
    					cardDup = 1; 
    				}
    			}
    		}
    		while (cardDup == 1); 
    	}
    }
    // Function that changes the suit integer value to a character representing the suit
    char getSuit(int suit) {
    	switch (suit) {
    		case 0: return('c'); 
    		case 1: return('d'); 
    		case 2: return('h'); 
    		case 3: return('s'); 
    	}
    }
    // Function that changes the rank integer value to a character representing the rank
    char getRank(int rank) {
    	switch (rank) {
    		case 0: return('A'); 
    		case 1: return('2'); 
    		case 2: return('3'); 
    		case 3: return('4'); 
    		case 4: return('5'); 
    		case 5: return('6'); 
    		case 6: return('7'); 
    		case 7: return('8'); 
    		case 8: return('9'); 
    		case 9: return('T'); 
    		case 10: return('J'); 
    		case 11: return('Q'); 
    		case 12: return('K'); 
    	}
    }
    // Function to get the user's bet between 1 and 5
    int getBet() {
    	int bet; 
    
    
    	// Will keep running until the user enters 0-5
    	do {
    		printf("How much do you want to bet? (Enter a number 1 to 5, or 0 to quit the game): "); 
    		scanf(" %d", &bet); 
    		if (bet >= 1 && bet <= 5) {
    			return(bet); 
    		}
    		else if (bet == 0) {
    			exit(1); 
    		}
    		else {
    			printf("\n\nPlease enter a bet from 1-5 or 0 to quit the game.\n"); 
    		}
    	}
    	while ((bet < 0) || (bet > 5)); 
    }
    // Last function reviews the final hand and determines the value of the hand
    int analyzeHand(int ranksinHand[], int suitsinHand[]) {
    	int num_consec = 0; 
    	int rank, suit; 
    	int straight = FALSE; 
    	int flush = FALSE; 
    	int four = FALSE; 
    	int three = FALSE; 
    	int pairs = 0; 
    
    
    	for (suit = 0; suit < 4; suit++)
    		if (suitsinHand[suit] == 5) 
    			flush = TRUE; 
    	rank = 0; 
    	while (ranksinHand[rank] == 0) 
    		rank++; 
    	for (; rank < 13 && ranksinHand[rank]; rank++) 
    		num_consec++; 
    	if (num_consec == 5) {
    		straight = TRUE; 
    	}
    	for (rank = 0; rank < 13; rank++) {
    		if (ranksinHand[rank] == 4)
    			four = TRUE; 
    		if (ranksinHand[rank] == 3)
    			three = TRUE; 
    		if (ranksinHand[rank] == 2) 
    			pairs++; 
    	}
    
    
    	if (straight && flush) {
    		printf("Straight flush\n\n"); 
    		return (20); 
    	}
    	else if (four) {
    		printf("Four of a kind\n\n"); 
    		return (10); 
    	}
    	else if (three && pairs == 1) {
    		printf("Full house\n\n"); 
    		return (8); 
    	}
    	else if (flush) {
    		printf("Flush\n\n"); 
    		return (5); 
    	}
    	else if (straight) {
    		printf("Straight\n\n"); 
    		return (4); 
    	}
    	else if (three) {
    		printf("Three of a kind\n\n"); 
    		return (3); 
    	}
    	else if (pairs == 2) {
    		printf("Two pairs\n\n"); 
    		return (2); 
    	}
    	else {
    		printf("High Card\n\n"); 
    		return (0); 
    	}
    	
    }
    
    
    /* This function looks through each of the five cards in the first hand and asks the user if they want to keep the 
    	card. If they say no, they get a replacement card. */ 
    void getFinalHand(int cardRank[], int cardSuit[], int finalRank[], int finalSuit[], int ranksinHand[], int suitsinHand[]) {
    	int i, j, cardDup; 
    	char suit, rank, ans; 
    
    
    	for (i = 0; i < 5; i++) {
    		suit = getSuit(cardSuit[i]); 
    		rank = getRank(cardRank[i]); 
    		printf("Do you want to keep card #%d: %c%c?", i+1, rank, suit); 
    		printf("\nPlease answer (Y/N): "); 
    		scanf(" %c", &ans); 
    		if (toupper(ans) == 'Y') {
    			finalRank[i] = cardRank[i]; 
    			finalSuit[i] = cardSuit[i]; 
    			ranksinHand[finalRank[i]]++; 
    			suitsinHand[finalSuit[i]]++; 
    			continue; 
    		}
    		else if (toupper(ans) == 'N') {
    			cardDup = 0; 
    			do {
    				cardDup = 0; 
    				finalRank[i] = (rand() % 13); 
    				finalSuit[i] = (rand() % 4); 
    
    
    				// First check your new card against the 5 original cards to avoid duplication
    				for (j = 0; j < 5; j++) {
    					if ((finalRank[i] == cardRank[j]) && (finalSuit[i] == cardSuit[j])) {
    						cardDup = 1; 
    					}
    				}
    				// Next, check the new card against any newly drawn cards to avoid duplication
    				for (j=0; j<i; j++) {
    					if ((finalRank[i] == finalRank[j]) && (finalSuit[i] == finalSuit[j])) {
    						cardDup = 1; 
    					}
    				}
    			}
    			while (cardDup == 1); 
    			ranksinHand[finalRank[i]]++; 
    			suitsinHand[finalSuit[i]]++; 
    		}
    	}
    }
    Any help would be greatly appreciated.

  2. #2
    Lurking whiteflags's Avatar
    Join Date
    Apr 2006
    Location
    United States
    Posts
    9,612
    Yeah there are easy fixes for all of those warnings.

    They are basically the kind of warnings that are there to appease the compiler, especially if you sanitize your inputs (like you're attempting) and know that your switch will always have a given result, and loops will always end.

    Create a default case that returns a character you won't use.

    For the loop, just break instead, and return near the bottom.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. control reaches end of non void function in bool function
    By Giwrgows x in forum C Programming
    Replies: 26
    Last Post: 12-19-2015, 02:58 PM
  2. Replies: 3
    Last Post: 07-07-2013, 01:41 AM
  3. void* warnings
    By tytelizgal in forum C Programming
    Replies: 12
    Last Post: 10-17-2008, 09:27 AM
  4. warning: control reaches end of non-void function
    By franziss in forum C Programming
    Replies: 5
    Last Post: 01-29-2005, 11:46 PM
  5. Void Pointer Warnings
    By peking1983 in forum C Programming
    Replies: 6
    Last Post: 07-07-2004, 09:11 PM

Tags for this Thread