2012-09-10 3 views
2

나는 방금 C를 배우려고 노력 중이며 막혀있다. 나는 연산자와 함께 두 숫자의 입력을 받아서 대답을 인쇄 할 수있는 프로그램을 만들려고합니다.C에서 인수로 char 전달 Q

표기법은 폴란드어 표기법을 반대로합니다. 즉, 입력 2 1 +는 출력 3을 제공해야하고, 입력 2 1 *은 출력 2를 제공해야합니다.

나중에, 일부 스택 기반으로 더 긴 표현식을 rpn에 입력 할 수 있도록 확장 할 것입니다. 이제는 두 개의 피연산자 만 사용하여 사례에 집중할 수 있습니다.

이 내가 한 일이다

이 의심에서 작동하고 번호 1 및 번호 2의 합계를 써
#include <stdio.h> 

main() 
{ 
    int number1; 
    int number2; 
    char operator; 
    scanf("%d %d %c", &number1, &number2, &operator); 
    printf("%d", calculate(number1, number2)); 
} 

int calculate(int number1, int number2) 
{ 
    return number1+number2; 
} 

. 나는이

#include <stdio.h> 

main() 
{ 
    int number1; 
    int number2; 
    char operator; 
    scanf("%d %d %c", &number1, &number2, &operator); 
    printf("%d", calculate(number1, number2, operator)); 
} 

int calculate(int number1, int number2, char operator) 
{ 
    return number1+number2; 
} 

처럼, 함수 계산에 인수로 문자를 통과 할 때 그러나, 나는 컴파일 오류

rpn.c:12:5: error: conflicting types for ‘calculate’ 
rpn.c:13:1: note: an argument type that has a default promotion can’t match an empty parameter name list declaration 
rpn.c:9:15: note: previous implicit declaration of ‘calculate’ was here 

는 C에서 인수로 문자를 통과 할 수 없습니다를 얻을 ? int로 작동 할 때 왜 작동하지 않는지 이해할 수 없습니다. 나는 이것에 대해 많이 봤지만 질문은 대개 char가 아닌 char의 배열을 char로 전달하는 것을 다룹니다.

아니면이 모든 것을 잘못하고 있습니까?

답변

3

기능보다 위에 calculate() 기능을 넣으십시오. 컴파일러는 함수를 호출하기 전에 함수에 대해 알아야합니다.

또는 당신 main() 전에이 줄을 포함하여 main에게 그것을 앞으로 선언 할 수

int calculate(int number1, int number2, char operator); 

또한 컴파일러에서 경고를 켜하는 데 도움이 될 것입니다. GCC를 사용하면 -Wall을 사용할 수 있습니다.

2

컴파일러가 을 호출하지 않기 때문에 을 참조하기 전에 calculate()이라는 정의가 호출되기 전에 암시 적으로 선언을 만들어야하며 선언이 올바른지 확인해야합니다. 그것은 그렇지 않다는 것이 밝혀졌습니다.

는이 문제를 해결, 하나이 호출 calculate() 최대 main() 위의 정의를 이동, 또는 대안를 선언 calculate()의 함수 프로토 타입을 제공하기 위해 어떤 함수가 main() 전에,이 호출 전에 다음과 같습니다

int calculate(int number1, int number2, char operator); 

변수에 operator 식별자를 사용하고 코드를 컴파일하는 데 C++ 컴파일러를 사용하면 operator이 C++ 키워드이므로 오류가 발생합니다.

+0

마지막 문제에 대한 해결책은 간단합니다. C 컴파일러를 사용하여 C 코드를 컴파일합니다. –

+0

@KeithThompson : 좋은 지적이지만, 많은 사람들이 C++ 컴파일러로 C 코드를 컴파일하는 것을 보았습니다. – AusCBloke

+0

아직 이해가 안됩니다. 인수가 int로 작동하지만 두 int와 char로는 작동하지 않는 이유는 무엇입니까? 내가 아직 선언하지 않았다면, 그 경우에도 오류 메시지가 표시되지 않습니까? – user1661303

1

컴파일러가 calculate으로 전화를 걸 때 아직 선언되지 않은 코드는 calculate입니다.

는 우선, main의 당신의 정의하기 전에이 행을 추가합니다. () 후 세미콜론 주)

int calculate(int number1, int number2, char operator); 

을 그 미리 선언하지 않고, calculate에 대한 호출은 암시 적 선언을 만듭니다 외침에; 암시 적 선언은 동일한 방식으로 작동하지 않습니다 (인수 프로모션 및 구식 함수 선언과 관련된 역사적인 이유로 모호한 점, 세부 사항에 대해서는 걱정하지 마십시오). 그것은 1990 년 버전의 언어입니다. 1999 ISO C 표준을 시작으로 이러한 암시 적 함수 선언은 존재하지 않습니다. 컴파일러를 호출하여 C99 표준 (또는 지원하는 경우 C11)을 준수하는지 고려하십시오. gcc를 사용하고있는 것으로 보입니다. 그렇다면 gcc -std=c99 -pedantic -Wall -Wextra은 일반적으로보다 철저한 진단을 제공합니다.

다른 어떤 개선 :

main()int main(void)해야한다.

형식 문자열 "%d""%d\n"이어야하며 전체 줄을 인쇄합니다.

(물론 당신이 operator의 가치에 주목하는 calculate를 원하지만, 당신이해야하는 것은 좋은 시작입니다 수 있습니다.)

+0

빠른 응답을 보내 주신 모든 분들께 감사드립니다. 나는 그것을 시도 할 것이다. 또한이 void 함수가 int인지 궁금합니다. c는 작고 가능한 한 메모리 공간이 적도록 설계되지 않았습니까? 그렇다면 왜 모든 void 함수가 int를 반환하도록 만드는 것이 합리적일까요? 기능을 필요 이상으로 많은 메모리를 사용하게 만들까? gcc를 사용하고 있는데, C++ 키워드를 컴파일하려고합니까, 아니면 안전합니까? – user1661303

+0

@ user1661303 : 아니요,'void' 함수는'int'가 아닙니다. 'void'를 반환하도록 정의 된 함수는 결과를 반환하지 않습니다. 'int'를 반환하도록 정의 된 함수는'int' 결과를 반환합니다. * 1999 표준 * 이전에는 명시 적 유형이없는 함수는 암시 적으로 int를 반환하므로 func(); 및 int func();은 동등한 선언입니다. (1989/1990 표준 이전에는 'void'키워드가 없었습니다.) 1999 표준은이 "암시 적 int"규칙을 삭제 했으므로 더 이상 유형을 생략 할 수 없습니다. 함수가'int'를 반환하면 명시 적으로 말해야합니다. 이것은 메모리 사용량과는 아무런 관련이 없습니다. –

+0

그래서 1989 표준 이전에 제대로 이해한다면, 값을 반환하지 않는 함수를 사용할 수 없었을 것입니다.이 함수 자체가 반환 값을 보낼 필요가 없더라도 int를 반환해야하기 때문에 메모리 사용 공간이 커질까요? newbe 질문에 사과드립니다. – user1661303

2

당신은 함수 계산을위한 prototype에 대한 컴파일러 말할 필요 .

#include <stdio.h> 

int calculate(int,int, char); // This is your prototype. 
main() 
{ 
    int number1; 
    int number2; 
    char operator; 
    scanf("%d %d %c", &number1, &number2, &operator); 
    printf("%d", calculate(number1, number2, operator)); 
} 

int calculate(int number1, int number2, char operator) 
{ 
    return number1+number2; 
} 
+3

매개 변수 이름은 선택 사항입니다. 프로토 타입에서 (이것은 정의의 일부가 아닙니다). 다시 말해 int 계산 (int, int, char);을 쓸 수 있지만 int 계산 (int number1, int number2, char 연산자);을 쓸 수도 있습니다. IMHO, 더 명백한 형태가 더 좋습니다. –