|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Aug 2009
Città: Cagliari
Messaggi: 10
|
[Linguaggio C] Da Infissa a Postfissa
Salve a tutti, sto cercando di far girare un seplice programmino che trasformi una espressione dal formato infisso al postfisso. Ho trovato delle slide d'universita dove copiare gli algortmi necessari, che quindi, in teoria, dovrebbero essere giusti. Trovo un problema alla compilazione, posto il codice:
#include <stdio.h> #include <string.h> #define MAX_STACK_SIZE 100 /*Dimensione massima dello stack*/ #define MAX_EXPR_SIZE 100 /*Dimensione massima dell'espressione*/ typedef enum{parsx, pardx, sum, diff, per, div, mod, eos, oper} precedenza; int stack[MAX_STACK_SIZE]; char expr[MAX_EXPR_SIZE]; int top = -1; static int prd[]= {0, 19, 12, 12, 13, 13, 13, 0}; static int prf[]= {20, 19, 12, 12, 13, 13, 13, 0}; precedenza get_token(char *, int *); void print_token(precedenza); void postfix(void); void add(int *,int ); int del(int *); main() { //int k; printf("Inserisci l'espressione\n"); fflush(stdin); scanf("%s", expr); /* gets(expr); k=strlen(expr); expr[k+1]=' '; printf("\n\n%d\n\n",k); */ //precedenza token; postfix(); fflush(stdin); getchar(); } precedenza get_token(char *simbolo, char *expr, int *n) { /* Acquisisce il token sucessivo; Simbolo è la rappresenzazione del carattere che viene fornito; Token è rappresentato dal suo valore enumerativo, fornito nel nome della funzione; */ *simbolo=expr[(*n)++]; switch (*simbolo) { case '(': return parsx; case ')': return pardx; case '+': return sum; case '-': return diff; case '*': return per; case '/': return div; case '%': return mod; case ' ': return eos; case '\0': default : return oper; } } void postfix(void) { char simbolo,buf; precedenza token; int n = 0; int top = 0; int count = -1; stack[0] = eos; for (token=get_token(&simbolo,&n); token!=eos; token=get_token(&simbolo, &n)) { if (token == oper) printf("%c",simbolo); else if (token == pardx) { /* Svuota lo stack fino alla prentesi sx */ while (stack[top] != parsx) {print_token(del(&top)); } //!!!!!!!!! del(&top); // Elimina la parentesi sinistra } else { /* Elimina e visualizza i simboli la cui priorità dentro lo stack è >= alla priorità fuori dalla stack */ while (prd[stack[top]] >= prf[token]) print_token(del(&top)); add(&top, token); } } while ((token = del(&top)) != eos) print_token(token); } precedenza del(int *top) { return stack[(*top)--]; } void add(int *top, int item) { if(*top < MAX_STACK_SIZE-1) stack[++*top]=item; } void print_token(precedenza simbolo) { //rintf("%c",simbolo); switch (simbolo) { case parsx: printf("( "); case pardx: printf(") "); case sum: printf("+ "); case diff: printf("- "); case per: printf("* "); case div: printf("/ "); case mod: printf("% "); default: printf(" "); } } L'errore sta qui: print_token(del(&top)); invalid conversion from `int' to `precedenza' La cosa veramente strana è che nel codice di un mio amico in cui è presente la stessa riga, l'errore non c'è. Vi prego aiutatemi, grazie...
__________________
Pc: Asus P5KC - 4x1Gb Kingston - Intel Core 2 Duo 2,6Ghz - ATI HD2900XT - Case Hantek Solo - Termalthek 680W Notebook: MacBook Pro 15" - Intel Core 2 Duo 2.4Ghz - 2Gb 1067Mhz DDR3 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:20.



















