Exemplo n.º 1
0
        public void CompararValor(EscritorC escritor, string variable)
        {
            //(!this.EsDeSalidaOEntradaSalida);
            string diferencia   = "AUX" + variable;
            string varPrecision = "PR" + variable;
            string iterador     = "IT" + variable;

            switch (Definicion.Tipo)
            {
            case Tipo.UInt8:
            case Tipo.UInt16:
            case Tipo.UInt32:
            case Tipo.UInt64:
            case Tipo.Int8:
            case Tipo.Int16:
            case Tipo.Int32:
            case Tipo.Int64:
                escritor.If(variable + " != " + Valor);
                escritor.PrintfValorDistintoConDiferencia(variable, Valor);
                escritor.WriteLine("cantErrores++;");
                escritor.FinIf();
                break;

            case Tipo.Char:
                escritor.If(variable + " != " + "'" + Valor + "'");
                escritor.PrintfValorDistintoChar(variable, Valor);
                escritor.WriteLine("cantErrores++;");
                escritor.FinIf();
                break;

            case Tipo.Booleano:
                escritor.If("(" + variable + " == " + "0 && " + Valor + "!=0)||(" + variable + " != " +
                            "0 && " + Valor + "==0)");
                escritor.PrintfValorDistinto(variable, Valor);
                escritor.WriteLine("cantErrores++;");
                escritor.FinIf();
                break;

            case Tipo.Float32:
                // Realiza la resta entre ambos operandos y si la misma dio un resultado menor que
                // 10^precision entonces los considera iguales
                MA.EliminarAsteriscos(ref diferencia);
                MA.EliminarCorchetes(ref diferencia);
                MA.EliminarAsteriscos(ref varPrecision);
                MA.EliminarCorchetes(ref varPrecision);

                escritor.WriteLine("float " + diferencia + " = (" + variable + ") - (" + Valor + ");");
                escritor.WriteLine(diferencia + " = (" + diferencia + " >= 0) ? " + diferencia + " : -" +
                                   diferencia + ";");
                escritor.WriteLine("float " + varPrecision + " = pow((float)10, -" + Definicion.Precision + ");");
                escritor.If(diferencia + " >= " + varPrecision);
                escritor.PrintfValorDistintoFloatConDiferencia(variable, Valor, diferencia);
                escritor.WriteLine("cantErrores++;");
                escritor.FinIf();
                break;

            case Tipo.Float64:
                MA.EliminarAsteriscos(ref diferencia);
                MA.EliminarCorchetes(ref diferencia);
                MA.EliminarAsteriscos(ref varPrecision);
                MA.EliminarCorchetes(ref varPrecision);

                escritor.WriteLine("float " + diferencia + " = (" + variable + ") - (" + Valor + ");");
                escritor.WriteLine(diferencia + " = (" + diferencia + " >= 0) ? " + diferencia + " : -" +
                                   diferencia + ";");
                escritor.WriteLine("double " + varPrecision + " = pow((double)10, -" + Definicion.Precision + ");");
                escritor.If(diferencia + " >= " + varPrecision);
                escritor.PrintfValorDistintoFloatConDiferencia(variable, Valor, diferencia);
                escritor.WriteLine("cantErrores++;");
                escritor.FinIf();
                break;

            case Tipo.CadenaC:
                escritor.WriteLine("char " + diferencia + "[] = \"" + Valor + "\";");
                escritor.WriteLine("int " + iterador + ";");
                escritor.For(iterador + "=0", diferencia + "[" + iterador + "]!=0 && " +
                             variable + "[" + iterador + "]!=0", iterador + "++");
                escritor.If(variable + "[" + iterador + "] != " + diferencia + "[" +
                            iterador + "]");
                escritor.PrintfValorDeStringDistintos(variable, iterador, diferencia);
                escritor.WriteLine("cantErrores++;");
                escritor.FinIf();
                escritor.FinFor();
                break;

            case Tipo.CadenaPascal:
                break;
            }
        }