Необъявленная ошибка "Stack". С Java на C
Для моего класса я должен перевести предоставленный нам код и перевести его с Java на C. Это мое первое знакомство с C. Итак, я завершил это. После компиляции я получаю около 6 ошибок о том, что стек не объявлен. И в коде используется стек. Может кто-нибудь помочь указать, где я ошибся.
// $Id: crpn.c,v 1.28 2014-04-08 15:23:19-07 - - $
// NAME
#include <assert.h>
#include <libgen.h>
#include <stdio.h>
#include <stdlib.h>
int exit_status = EXIT_SUCCESS;
#define EMPTY (-1)
#define SIZE 16
struct stack{
int top;
double numbers[SIZE];
};
void bad_operator (const char *oper) {
fflush (NULL);
fprintf (stderr, "oper=\"%s\"\n", oper);
fflush (NULL);
exit_status = EXIT_FAILURE;
}
void push (struct stack *the_stack, double number) {
if(stack->top >= SIZE - 1){
printf ("%s: stack overflown%n", number);
}else{
stack->numbers[++stack->top] = number;
}
}
void do_binop (struct stack *the_stack, char oper) {
if (stack->top < 1) {
printf ("'%s': stack undeflow", oper);
}else{
double right = stack->numbers[stack->top--];
double left = stack->numbers[stack->top--];
switch (oper) {
case '+': push (stack, left + right); break;
case '-': push (stack, left - right); break;
case '*': push (stack, left * right); break;
case '/': push (stack, left / right); break;
}
}
}
void do_print (struct stack *the_stack) {
if (stack->top == EMPTY) {
printf ("stack is empty%n");
}else {
for (int pos = 0; pos <= stack->top; ++pos) {
printf ("%s%n", stack->numbers[pos]);
}
}
}
void do_clear (struct stack *the_stack) {
stack->top = EMPTY;
}
void do_operator (struct stack *the_stack, const char *oper) {
switch (oper->charAt(0)) {
case '+': do_binop (stack, '+'); break;
case '-': do_binop (stack, '-'); break;
case '*': do_binop (stack, '*'); break;
case '/': do_binop (stack, '/'); break;
case ';': do_binop (stack); break;
case '@': do_clear (stack); break;
default : bad_operator (oper); break;
}
}
int main (int argc, char **argv) {
if (argc != 1) {
fprintf (stderr, "Usage: %s\n", basename (argv[0]));
fflush (NULL);
exit (EXIT_FAILURE);
}
struct stack the_stack;
the_stack.top = EMPTY;
char buffer[1024];
for (;;) {
int scanrc = scanf ("%1023s", buffer);
if (scanrc == EOF) break;
assert (scanrc == 1);
if (buffer[0] == '#') {
scanrc = scanf ("%1023[^\n]", buffer);
continue;
}
char *endptr;
double number = strtod (buffer, &endptr);
if (*endptr == '\0') {
push (&the_stack, number);
}else if (buffer[1] != '\0') {
bad_operator (buffer);
}else {
do_operator (&the_stack, buffer);
}
}
return exit_status;
}
Сообщение об ошибке:
crpn.c: In function ‘push’:
crpn.c:25:7: error: ‘stack’ undeclared (first use in this function)
if(stack->top >= SIZE - 1){
^
crpn.c:25:7: note: each undeclared identifier is reported only once for each function it appears in
crpn.c:26:7: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘double’ [-Wformat=]
printf ("%s: stack overflown%n", number);
^
crpn.c:26:7: warning: format ‘%n’ expects a matching ‘int *’ argument [-Wformat=]
crpn.c:24:26: warning: unused parameter ‘the_stack’ [-Wunused-parameter]
void push (struct stack *the_stack, double number) {
^
crpn.c: In function ‘do_binop’:
crpn.c:33:8: error: ‘stack’ undeclared (first use in this function)
if (stack->top < 1) {
^
crpn.c:34:7: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
printf ("'%s': stack undeflow", oper);
^
crpn.c:32:30: warning: unused parameter ‘the_stack’ [-Wunused-parameter]
void do_binop (struct stack *the_stack, char oper) {
^
crpn.c: In function ‘do_print’:
crpn.c:48:8: error: ‘stack’ undeclared (first use in this function)
if (stack->top == EMPTY) {
^
crpn.c:49:7: warning: format ‘%n’ expects a matching ‘int *’ argument [-Wformat=]
printf ("stack is empty%n");
^
crpn.c:47:30: warning: unused parameter ‘the_stack’ [-Wunused-parameter]
void do_print (struct stack *the_stack) {
^
crpn.c: In function ‘do_clear’:
crpn.c:58:4: error: ‘stack’ undeclared (first use in this function)
stack->top = EMPTY;
^
crpn.c:57:30: warning: unused parameter ‘the_stack’ [-Wunused-parameter]
void do_clear (struct stack *the_stack) {
^
crpn.c: In function ‘do_operator’:
crpn.c:62:16: error: request for member ‘charAt’ in something not a structure or union
switch (oper->charAt(0)) {
^
crpn.c:63:27: error: ‘stack’ undeclared (first use in this function)
case '+': do_binop (stack, '+'); break;
^
crpn.c:67:7: error: too few arguments to function ‘do_binop’
case ';': do_binop (stack); break;
^
crpn.c:32:6: note: declared here
void do_binop (struct stack *the_stack, char oper) {
^
crpn.c:61:33: warning: unused parameter ‘the_stack’ [-Wunused-parameter]
void do_operator (struct stack *the_stack, const char *oper) {
2 ответа
'стек' необъявленная ошибка
stack
это тип, но ваш указатель the_stack
void push (struct stack *the_stack, double number)
так что вам нужно использовать the_stack
вместо stack
в таких заявлениях
if(stack->top >= SIZE - 1){
Переменная объявлена как the_stack
:
void push (struct stack *the_stack, double number) {
Но вы ссылаетесь на это как stack
:
if(stack->top >= SIZE - 1){
Нет переменной stack
в вашем коде, поэтому компилятор жалуется на неизвестные идентификаторы. struct stack
является базовым типом переменной the_stack
(полный тип struct stack *
).