Hi, I am programming something to change from infix to postfix notation, However I get a general protection exception when i try to call the function that checs if the notation is correct.
I don´t even know what a general protection exception is, can someone tell me please what is it, and also, can someone help me to get rid of it, i´ll place the first part of the code:
Code:
void cambio(int,int); //esta funcion cambia entre las bases
char *pedir_infija(); //esta funcion pide la expresion de forma infija
char *posfija(char*); //esta funcion cambia la expresion a postfija
int comprobar(char*); //comprueba que la expresi¢n se haya dado de manera correcta
int eval(char *); //Da el resultado de la postfija
int convnum(char); //Convierte el caracter a su numero equivalente
void main(){
clrscr();
int comp=0,resul=0,op=0,z=1,yapos=0,yain=0,sicon=0,base=10;
char *expre, *postex;
while(op!=4){
op=0;
while(op>z||op<1){
z=1;
printf("\n\n---------Convertidor de expresiones---------\n");
printf("\n%d. Aceptar infija",z++);
if(yain==1){
printf("\n%d. Convertir a postfija",z++);
}
if (yapos==1){
if(resul==-60){
printf("\nOperacion invalida division entre cero");
}else{
printf("\n%d. Evaluar postfija",z++);
}
}
printf("\n%d. Salir\n\n Opcion: ",z);
scanf("%d",&op);
getchar();
}
if(op==z)op=4;
switch(op){
case 1:
comp=0;
while(comp==0){ //mientras no sea valida la expresion la pedirI am silly de nuevo
printf("\nDame la expresion infija: ");
scanf("%s",&expre);
getchar();
comp=comprobar(expre); /* general protectio exception is here*/
}
//printf("\nLa expresi¢n infija es: %s",expre);
yain=1;
yapos=0;
break;
case 2:
postex=posfija(expre); //llamada a la conversion a postfija
printf("Postfija: ");
printf("%s",postex);
resul=eval(postex);
yapos=1;
break;
case 3:
//calcula el resultado
printf("Resultado: %d",resul);
sicon=0;
while(sicon!=2){
sicon=0;
while(sicon>2||sicon<1){
printf("\nConvertir? (1.Si,2.No): ");
scanf("%d",&sicon);
getchar();
}
if(sicon!=2){
printf("\nEscribe la base: ");
scanf("%d",&base);
cambio(resul,base);
}
}
break;
}
}
}
int comprobar(char *expre){ /*here is where the function begins*/
int x,y=1,abr=0,cer=0;
for(x=0;x<strlen(expre);x++){ //va comprobando cada caracter
//comprueba de la lista de posibles caracteres que no haya ninguno
if(expre[x]!='+'&&expre[x]!='-'&&expre[x]!='*'&&expre[x]!='/'&&expre[x]!='%'&&expre[x]!='('&&expre[x]!=')'&&!isdigit(expre[x])) y=0;
if(expre[x]=='+'||expre[x]=='-'||expre[x]=='%'||expre[x]=='/'||expre[x]=='*'){ //En caso de que sea operador
if((!isdigit(expre[x-1])&&expre[x-1]!=')')||x==0){ //si el anterior a l operador no es un digito
y=0;
}
}
if(expre[x]=='('){ //cuenta parentesis abiertos
abr++;
}
if(expre[x]==')'){ //cuenta parentesis cerrados
cer++;
}
if(expre[x]==')'){ //verifica que cuando cierre parentesis lo anterior sea digito
if(!isdigit(expre[x-1])&&expre[x-1]!=')') y=0;
}
}
if(abr!=cer) y=0; //si no son la misma cantidad de parentesis abiertos que cerrados
if(!isdigit(expre[strlen(expre)-1])&&expre[strlen(expre)-1]!=')') y=0; //si el ultimo caracter es invalido
if(y==0) printf("Expresion Invalida\n\n");
return y;
}
}
I wont´paste the rest of the code, since it is very long as you can see
thank you