2013-09-06 7 views
1

В настоящее время я пытаюсь написать простую программу Rock, Paper, Scissors в C. Весь смысл задания - познакомиться с использованием символов. Вот код, который у меня есть. Это неполно, поскольку я застрял.Функция не возвращает символ правильно: ошибка во время компиляции

#include <stdio.h> 

int main() 
{ 
    int pScore = 0; 
    int cScore = 0; 
    int ties = 0; 
    char play, go; 
    char comp = 'r'; 

    printf("Welcome to Rock-Paper-Scissors!\n"); 
    printScore(pScore, cScore, ties); 
    for (; ;) 
    { 
     printf("Do you want to play Rock-Paper-Scissors? (y/n): "); 
     scanf("\n%c", &go); 
     if(go == 'y' || go == 'Y') 
     { 
      printf("Enter your choice (r,p,s): "); 
      scanf("\n%c", &play); 
      comp = computerPlay(); 
      printf("Computer plays: %c", comp); 
     } 
     else 
      break; 
    } 
    printf("\nThanks for Playing!!\n\n"); 
} 

char computerPlay() 
{ 
    int r = rand() % 3; 
    char c; 
    if (r == 0) 
    { 
     c = 'r'; 
    } 
    else if (r == 1) 
    { 
     c = 'p'; 
    } 
    else if (r == 2) 
    { 
     c = 's'; 
    } 
    return c; 
} 

int printScore(int p, int c, int t) 
{ 
    printf("\nHuman Wins: %d  Computer Wins: %d  Ties: %d\n\n", p, c, t); 
    return 0; 
} 

Компилятор дает мне следующую ошибку:

RPS.c:35:6: error: conflicting types for ‘computerPlay’

RPS.c:28:14: note: previous implicit declaration of ‘computerPlay’ was here

Мне кажется, это должно работать нормально .... Я в растерянности ,

+2

heh. 'char computerPlay() {return" rpc "[rand()% 3]; } 'sry. не мог устоять. – WhozCraig

ответ

3

вы не объявить функцию computerPlay()

чек после объявления этой функции.

char computerPlay(void); 

добавить это заявление после того, как #include<stdio.h>

EDIT:

Все идентификаторы в C должны быть объявлены до их использования. Это справедливо и для функций, и для переменных. Для функций декларация должна быть перед первым вызовом функции. Полная декларация включает в себя тип возвращаемого значения и количество и тип аргументов

простой пример:

int sum (int, int); // declared a function with the name sum 

result =sum(10,20); // function call 

int sum (int a, int b) // defined a function called sum 
    { 
     return a + b; 
    } 
+1

+1 Или переместите def над 'main()'. – WhozCraig

+1

И сделайте его статическим, если вы не хотите экспортировать функцию и ... (дождитесь, пока вы не обнаружите параметры предупреждения вашего компилятора :-)) – rockdaboot

+0

@WhozCraig, rockdadoot yes, декларация должна быть до main. Объявление должно быть глобальным (статическим или не статическим) и до определения функции. статическое объявление вроде этого ** static char computerPlay (void); ** хорошая идея, если он хочет ограничить область. Благодарю. – Gangadhar

2

В точке компилятор встречает использование функции, он должен знать о существовании функция.

В вашем коде, когда компилятор (считывая исходный файл) встречает comp = computerPlay();, он ничего не видел, говоря, что функция существует. У него есть предположение, что функция есть, и догадывается int computerPlay(void) - по умолчанию C всегда будет считать, что функция возвращает int. Затем он сталкивается с фактическим определением позже, что конфликтует с догадкой, которую он уже сделал - функция возвращает char, а не int.

Решение заключается в том, чтобы компилятор знал о существовании функции до ее использования.Вы можете:

  • движения всего определение функции выше main
  • положить заявление static char computerPlay(void); выше main, указав, что он доступен для данного исходного файла только
  • положить заявление char computerPlay(void); в отдельный файл заголовок, и #include этот файл выше main, что делает функцию доступной для других исходных файлов (с учетом других шагов, выходящих за рамки этого вопроса)
1

При использовании двух функций Одним из них является

символ computerPlay() и второй из них является

INT printScore (целое р, Int с, INT т) оба из них первых должна быть заявленным ниже включить заявление.

Так что просто сделайте следующее заявление ниже оператора include.

персональный компьютерPlay();

int printScore (int, int, int);

Вторая вещь, которую вы также используете INT основной() так что в конце концов вы должны иметь, чтобы вернуть целое число, так что вы также должны добавить следующее заявление в конце основного возвращения 0 или любого другого целого.