2014-05-23 9 views
0

나는 명령 줄에 의해 표현을 제공하는 rpn clalculator 내 학교 과제를 쓰려고합니다. Ex ./calc 2 + 5 \* sin 78atof() assining 0 어디 dobule해야합니까

제 생각에는 숫자 값이나 연산자 유형을 유지하기 위해 struct 데이터 형식을 사용하는 것이 좋습니다. 여기에 모든 것을 명확히 주입니다 :

#include <stdlib.h> 
#include <math.h> 
#include <string.h> 


enum OPERATORS {val, PLUS, MINUS, MULTI, DIV, SIN, COS}; 
typedef struct value { 

    double number; 
    enum OPERATORS oper; 
}; 


void get_the_onp(char *expression[], int length); 


int main(int argc, char* argv[]) { 

    double result; 
    int i; 
    printf("Number of arguments: %d\n", argc); 


    get_the_onp(argv, argc); 
    //result = equation(argv, argc); 

    //printf("Result is: %f", result); 
    return 0; 
} 

내가 의심으로 atof()가 작동하지 않는 get_the_onp() 기능을 실행합니다. 여기에 get_the_onp()입니다 :

void get_the_onp(char* expression[], int length) { 

    int i, j, k; //iterators i for expression; j for numbers; k for operators 
    char *current; 
    struct value values[length]; 


    for (i=1; i<length; i++) { 
     current = expression[i]; 
     //printf("%f\n", atof(expression[i])); 
     if (atof(current) != 0 && current != '0') { 
      //printf("Inside if: %f\n", atof(current)); 
      values[i-1].number = (double) atof(current); 
      values[i-1].oper = val; 
     } 

     else{ 
      switch(current[0]){ 

       case '+': 
        //values[i].number = NULL; 
        values[i-1].oper = PLUS; 
        break; 
       case '-': 
        //values[i].number = NULL; 
        values[i-1].oper = MINUS; 
        break; 
       case '*': 
        //values[i].number = NULL; 
        values[i-1].oper = MULTI; 
        break; 
       case '/': 
        //values[i].number = NULL; 
        values[i-1].oper = DIV; 
        break; 
       case 's': 
        //values[i].number = NULL; 
        values[i-1].oper = SIN; 
        break; 
       case 'c': 
        //values[i].number = NULL; 
        values[i-1].oper = COS; 
        break; 
      } 
     } 
    } 

    //tester 
    for (i=0; i<length; i++) { 
      //if (values[i].oper != val) 
       printf("Operator: %d\n", values[i].oper); 

       printf("Number is: %d\n", values[i].number); 
    } 


    return; 

} 

예제 표현의 출력은 다음과 같습니다

Number of arguments: 7 
Operator: 0 
Number is: 2147483636 
Operator: 1 
Number is: 2147483636 
Operator: 0 
Number is: 2147483636 
Operator: 3 
Number is: 2147483636 
Operator: 5 
Number is: 2147483636 
Operator: 0 
Number is: 2147483636 
Operator: -2072959800 
Number is: 2147483626 

내가 포인터 current 뭔가가 있다고 생각하지만 지금은 따라 할 생각도 없어.

+2

'current! = '0' '이 올바르지 않습니다. 포인터 ('char *')를 비 포인터 ('char')와 비교합니다. – user694733

+0

여기.'./calc 2 + 5 \ * sin 78'은 올바른 rpn 구문이 아닙니다. 그림 rpn은 스택에서 숫자가 푸시되고 스택 (또는 sin과 같은 함수)이 스택에서 두 개의 요소 (또는 죄의 경우 하나)를 누를 때마다 그 결과를 푸시합니다. '2 +'는 작동하지 않습니다. –

+0

그래, 이제 구조체 값을 만든 후 알았어. rnp를 다루고 싶다. – advena

답변

4

문제는 바로 여기에 있습니다 :

printf("Number is: %d\n", values[i].number); 

values.number

유형 double (64 비트)입니다,하지만 당신은 정의되지 않은 동작을 호출하는 int (32 비트)로 인쇄된다.

+1

나는 미리 감사드립니다. – advena