コード例 #1
0
ファイル: Generador.cs プロジェクト: Erikhht/tuassembler
        private void EscribirFuncionDePrueba( EscritorC escritor )
        {
            escritor.WriteLine( PruebaActual.Prototipo );
            escritor.AbrirCorchetes();
            escritor.WriteLine( "//------------Variables comunes------------------" );
            escritor.WriteLine( "int salidaFree2;" );
            escritor.WriteLine( "long long tiempoDeEjecucion=0;" );
            escritor.WriteLine( "long long tiempo = 0;" );
            escritor.WriteLine( "int cantCorridas = 100;" );
            escritor.WriteLine( "//------------Parametros-------------------------" );
            PruebaActual.DeclararParametros( escritor );
            escritor.WriteLine( "int cantErrores = 0;" );
            if( !ContarCantInstrucciones )
            {
                escritor.WriteLine( "//------------Pedir memoria----------------------" );
                PruebaActual.PedirMemoria( escritor );
                escritor.WriteLine( "//------------Instanciacion----------------------" );
                PruebaActual.InstanciarParametros( escritor );
                escritor.WriteLine( "//------------LlamadaFuncion---------------------" );
                LlamarFuncionAProbar( escritor );
                escritor.WriteLine( "//------------Comparacion de valores-------------" );
                PruebaActual.CompararValoresDevueltos( escritor );
                escritor.WriteLine( "//------------Liberar memoria--------------------" );
                PruebaActual.LiberarMemoria( escritor );
                //Libera la memoria que pidió y verifica que no se haya escrito fuera del buffer.
                escritor.WriteLine( "//------------Informar cant. de errores----------" );
            }
            else
            {
                escritor.WriteLine( "//------------Cuento instrucciones--------------------" );
                escritor.While( "tiempoDeEjecucion < 10000" );
                escritor.WriteLine( "tiempoDeEjecucion = 0;" );
                escritor.WriteLine( "int i;" );
                escritor.For( "i =0", "i<cantCorridas", "i++" );
                escritor.WriteLine( "//------------Pedir memoria----------------------" );
                PruebaActual.PedirMemoria( escritor );
                escritor.WriteLine( "//------------Instanciacion----------------------" );
                PruebaActual.InstanciarParametros( escritor );
                escritor.WriteLine( "tiempo = timer();" );
                LlamarFuncionAProbar( escritor );
                escritor.WriteLine( "tiempoDeEjecucion += timer() - tiempo;" );
                escritor.WriteLine( "//------------Liberar memoria--------------------" );
                PruebaActual.LiberarMemoria( escritor );
                escritor.FinWhile();
                escritor.WriteLine( "cantCorridas *=10;" );
                escritor.FinFor();
                escritor.WriteLine( "tiempoDeEjecucion = tiempoDeEjecucion / cantCorridas;" );
                escritor.WriteLine();
                escritor.WriteLine( "//---Escribo en archivo la cant de inst.----------" );
                escritor.If( "fs" );
                escritor.Write( "fprintf( fs, \"" );
                foreach( Parametro param in PruebaActual.ParametrosEntrada )
                {
                    param.TamanioOValorParaMedicion( escritor );
                    escritor.Write( "\\t" );
                }
                escritor.WriteLine( "%d\\n\", tiempoDeEjecucion);" );
                escritor.FinIf();
            }

            escritor.PrintfPruebaConcluida();
            escritor.WriteLine( "return cantErrores;" );
            escritor.CerrarCorchetes();
        }
コード例 #2
0
ファイル: ParamMatriz.cs プロジェクト: Erikhht/tuassembler
 public override void PedirMemoria( EscritorC escritor )
 {
     string pedido;
     string varFila = Definicion.Nombre + "Fila";
     pedido = Definicion.Nombre + " = " + "malloc2( sizeof(" + Definicion.ObtenerNombreDelTipoParaC() + "*)*" +
         cantFilas + ", true );";
     escritor.WriteLine( pedido );
     escritor.WriteLine( "int " + varFila + ";" );
     escritor.For( varFila + " = 0", varFila + " < " + cantFilas, varFila + "++" );
     escritor.WriteLine( Definicion.Nombre + "[" + varFila + "] = malloc2( sizeof(" +
         Definicion.ObtenerNombreDelTipoParaC() + ")*" + cantColumnas + ", true);" );
     escritor.FinFor();
 }
コード例 #3
0
ファイル: Elem.cs プロジェクト: Erikhht/tuassembler
        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;
            }
        }
コード例 #4
0
ファイル: ParamMatriz.cs プロジェクト: Erikhht/tuassembler
        public override void LiberarMemoria( EscritorC escritor )
        {
            string pedido;
            string varFila = Definicion.Nombre + "Fila";
            //Libera cada una de las filas
            escritor.For( varFila + " = 0", varFila + " < " + cantFilas, varFila + "++" );
            escritor.WriteLine( "salidaFree2 = free2( " + Definicion.Nombre + "[" + varFila + "] );" );
            escritor.If( "salidaFree2 == escrituraFueraDelBuffer" );
            escritor.PrintfEscrituraFueraDelBufferEnFilaDeMatriz( Definicion.Nombre, varFila );
            escritor.WriteLine( "cantErrores++;" );
            escritor.FinIf();
            escritor.If( "salidaFree2 == liberarPosMemNoValida" );
            escritor.PrintfCambioDeDireccionDelPunteroEnFilaDeMatriz( Definicion.Nombre, varFila );
            escritor.WriteLine( "cantErrores++;" );
            escritor.FinIf();
            escritor.If( "salidaFree2 == dosFreeDelMismoBuffer" );
            escritor.PrintfDosFreeAlMismoParamEnFilaDeMatriz( Definicion.Nombre, varFila );
            escritor.WriteLine( "cantErrores++;" );
            escritor.FinIf();

            escritor.FinFor();

            //Libera el arreglo de punteros
            escritor.WriteLine( "salidaFree2 = free2( " + Definicion.Nombre + " );" );
            escritor.If( "salidaFree2 == escrituraFueraDelBuffer" );
            escritor.PrintfEscrituraFueraDelBuffer( Definicion.Nombre );
            escritor.WriteLine( "cantErrores++;" );
            escritor.FinIf();
            escritor.If( "salidaFree2 == liberarPosMemNoValida" );
            escritor.PrintfCambioDeDireccionDelPuntero( Definicion.Nombre );
            escritor.WriteLine( "cantErrores++;" );
            escritor.FinIf();
            escritor.If( "salidaFree2 == dosFreeDelMismoBuffer" );
            escritor.PrintfDosFreeAlMismoParam( Definicion.Nombre );
            escritor.WriteLine( "cantErrores++;" );
            escritor.FinIf();
        }