Error

I`m getting this error and warning when trying to add the modulus % operator to my calculator program:

Documents/program5.c:68:14: error: invalid operands to binary expression
('double' and 'double')
push(pop() % op2);
~~~~~ ^ ~~~
Documents/program5.c:72:9: warning: multi-character character constant
[-Wmultichar]
case '/n':
^
1 warning and 1 error generated.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120

#include <stdio.h>
#include <stdlib.h>  /* for atof() */
#include <ctype.h>

#define MAXOP 100  /* max size of operand or operator */
#define NUMBER '0'  /* signal that a number was found */
#define MAXVAL 100  /* maximum depth of val stack */
#define BUFSIZE 100

int sp = 0;           /* next free stack position */
double val[MAXVAL];   /* value stack */  

int getop(char s[]);
void push(double);
double pop(void);
int getch (void);
void ungetch(int);

/* reverse Polish calculator */

 int main()
 {
 
     int type;
	 double op2;
	 char s[MAXOP];
	 
 while ((type = getop(s)) != EOF) {
     switch (type)  {
	 
	 case NUMBER:
	      push (atof(s));
		  break;
		  
     case '+':
	 
	     push( pop() + pop() );
		 break;
		 
		 
	 case '*':
	 
	    push(pop() * pop());
	    break;
		
	 case '-':
	   
	 op2 = pop();                        /*   Addition on the real numbers is commutative because for any real numbers s,t, it is true that s+t=t+s.
                                           Addition and multiplication are commutative operations but subtraction and division are not. */
	 push(pop() - op2);
	 break;
	 
	 case '/':
	 
	 op2 = pop();
	 if (op2 != 0.0)
	     push(pop() / op2);
	 
	 else 
		  printf("error: zero divisor\n");
	 break;
	 
	 case '%':
	 
	 op2 = pop();
	    
	 push(pop() % op2);
	 break;
	 
	 
	  case '/n':
	 
     printf("\t%.8g\n" , pop());
	 break;
	 
	 default:
	 printf("error: unknown command %s\n", s);
	 break;
	 
     }
	 
   }
   return 0;
  
 }
	 
	 
	
	 
 /* push : push f onto value stack */
 
 void push(double f)
 {
    if (sp < MAXVAL)	
		val[sp++] = f;
	
	else
		printf("error: stack full, can`t push %g\n", f);
	
 }
 
 
 
 /* pop: pop and return top value from stack */
 
  double pop(void)
  {
  	
	  if (sp > 0)
		  return val[--sp];
	  else {
		  printf("error: stack empty/n");
		  return 0.0;
	  }
	  
  }

 ....



Why is that? Maybe because the % operator cannot applied to double? How should I fix these warnings anyway.
Last edited on
% can be used to get modulus of integral types (int, long) for floating point modulus use fmod.

The warning on line #72 is because you have used a forward slash (/) instead of backward (\). Same error on #113
Thank you codewalker but could I still use % for floating point types? The exercise states that I should give it the % operator.

Is it possible to modify pop() to return int instead?
Last edited on
Typecast both to long instead, so that all other things work as they are now.
try push(((long)pop()) % (long)op2);
@Codewalker: fmod worked for me, though the type conversion didn't :)

Now I need to add provisions for negative numbers. How should I do that?




Last edited on

I expected a reply but apparently not.

Could someone write in pseudocode what I should do? Thanks.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

 /* Getop: get next operator or numeric operand. */

int getop (char s[]) {
    int i, c;
    while ((s[0] = c = getch()) == ' ' || c == '\t')
      ;
    s[1] = '\0';
    if  (!isdigit(c) && c!= '.' && c!= '-')  
        return c;                    /* Not a number */
    i = 0;
    if (isdigit(c))        /*  collect integer part */
        while (isdigit(s[++i] = c = getch()))
            ;
    if (c == '.')
        while (isdigit(s[++i] = c = getch()))
            ;

    s[i] = '\0';
    if (c != EOF)
        ungetch(c);
    return NUMBER;
}
  
      
char buf[BUFSIZE];
int bufp = 0;             /* next free position in buf */

  int getch(void)           /* get a (possibly pushed back) character */

{
	
	return (bufp > 0) ? buf[--bufp] : getchar();
	
}
	  
	  
  void ungetch(int c)	  /* push character back on input  */
  {
	  if (bufp >= BUFSIZE)
		  printf("ungetch: too many characters\n");
	  
	  else
		   buf[bufp++] = c;
  }
	  
	  



And what does this line mean: while (isdigit(s[++i] = c = getch()));
Last edited on
Topic archived. No new replies allowed.