public override void CompararValor( EscritorC escritor ) { string variable = string.Empty; escritor.WriteLine( "//" + Definicion.Nombre ); 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: case Tipo.Char: case Tipo.Booleano: case Tipo.Float32: case Tipo.Float64: if( Definicion.TipoDeAcceso==ValorOReferencia.R ) variable = "*"; break; case Tipo.CadenaC: case Tipo.CadenaPascal: break; } variable += Definicion.Nombre; CompararValor( escritor, variable ); }
public override void CompararValor( EscritorC escritor ) { Elem elem = new Elem(); escritor.WriteLine( "//" + Definicion.Nombre ); for( int i = 0; i < Elementos.Length; i++ ) { elem = Elementos[i]; elem.Definicion.Tipo = Definicion.Tipo; elem.Definicion.TipoDeAcceso = ValorOReferencia.V; if( Definicion.Tipo==Tipo.Char ) elem.Valor = elem.Valor[1].ToString(); elem.CompararValor( escritor, Definicion.Nombre + "[" + i + "]" ); } }
public override void Instanciar( EscritorC escritor ) { string instanciacion; int fil = 0, col = 0; foreach( ParamVector fila in Filas ) { foreach( Elem elemento in fila.Elementos ) { instanciacion = Definicion.Nombre + "[" + fil + "][" + col + "] = " + elemento.Valor + ";"; escritor.WriteLine( instanciacion ); col++; } fil++; col = 0; } }
public override void PedirMemoria( EscritorC escritor ) { string pedido; int cantMemoria; cantMemoria = Longitud*MA.CuantosBytes( Definicion.Tipo ); pedido = Definicion.Nombre + " = " + "malloc2( " + cantMemoria + " ,true);"; escritor.WriteLine( pedido ); }
public override void LiberarMemoria( EscritorC escritor ) { 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(); }
public override void Instanciar( EscritorC escritor ) { string instanciacion; int i = 0; foreach( Elem elemento in Elementos ) { instanciacion = Definicion.Nombre + "[" + i + "] = " + elemento.Valor + ";"; escritor.WriteLine( instanciacion ); i++; } }
public override void Instanciar(EscritorC escritor) { string instanciacion = string.Empty; foreach (Elem elemento in Elementos) { switch (Definicion.Tipo) { case Tipo.UInt8: case Tipo.Int8: case Tipo.Char: instanciacion = "insertarchar(&" + Definicion.Nombre + "," + elemento.Valor + ", false);"; break; case Tipo.Int16: case Tipo.UInt16: instanciacion = "insertarshort(&" + Definicion.Nombre + "," + elemento.Valor + ", false);"; break; case Tipo.UInt32: case Tipo.Int32: instanciacion = "insertarint(&" + Definicion.Nombre + "," + elemento.Valor + ", false);"; break; case Tipo.Booleano: instanciacion = "insertarbool(&" + Definicion.Nombre + "," + elemento.Valor + ", false);"; break; case Tipo.UInt64: case Tipo.Int64: instanciacion = "insertarlonglong(&" + Definicion.Nombre + "," + elemento.Valor + ", false);"; break; case Tipo.Float32: instanciacion = "insertarfloat(&" + Definicion.Nombre + "," + elemento.Valor + ", false);"; break; case Tipo.Float64: instanciacion = "insertardouble(&" + Definicion.Nombre + "," + elemento.Valor + ", false);"; break; default: throw new Exception(Mensajes.TipoIncorrectoListas); } escritor.WriteLine(instanciacion); } }
private void EscribirReferenciaExternaDeLaFuncion( EscritorC escritor ) { escritor.WriteLine( "extern " + Definicion.GenerarPrototipo() + ";" ); escritor.WriteLine("extern long long timer();"); }
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(); }
public override void Instanciar( EscritorC escritor ) { string instanciacion = string.Empty; 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: if (Definicion.TipoDeAcceso == ValorOReferencia.R) instanciacion = "*"; instanciacion += Definicion.Nombre + " = " + Valor + ";"; break; case Tipo.Float32: case Tipo.Float64: if (Definicion.TipoDeAcceso == ValorOReferencia.R) instanciacion = "*"; instanciacion += Definicion.Nombre + " = 0;\n"; if (Definicion.TipoDeAcceso == ValorOReferencia.R) instanciacion += "*"; instanciacion += Definicion.Nombre + " += " + Valor + ";"; break; case Tipo.CadenaPascal: case Tipo.CadenaC: instanciacion = Definicion.ObtenerNombreDelTipoParaC() + " " + Definicion.Nombre + "[] = \"" + Valor + "\";"; break; case Tipo.Booleano: if( Definicion.TipoDeAcceso==ValorOReferencia.R ) instanciacion = "*"; instanciacion += Definicion.Nombre + " = " + ( UltimoElementoUno()? "true;" : "false;" ); break; case Tipo.Char: if( Definicion.TipoDeAcceso==ValorOReferencia.R ) instanciacion = "*"; instanciacion += Definicion.Nombre + " = '" + Valor + "';"; break; } escritor.WriteLine( instanciacion ); }
public override void Declarar( EscritorC escritor ) { string declaracion = string.Empty; declaracion = Definicion.ObtenerNombreDelTipoParaC() + " "; if( Definicion.Tipo!=Tipo.CadenaC && Definicion.Tipo!=Tipo.CadenaPascal ) { if( Definicion.TipoDeAcceso==ValorOReferencia.R ) declaracion += "*"; declaracion += Definicion.Nombre + ";"; escritor.WriteLine( declaracion ); } }
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(); }
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(); }
public override void CompararValor(EscritorC escritor) { escritor.WriteLine("//" + Definicion.Nombre); switch (Definicion.Tipo) { case Tipo.UInt8: case Tipo.Int8: case Tipo.Char: escritor.WriteLine("struct Listachar *" + Definicion.Nombre + "listaaux;"); escritor.WriteLine("crearchar(&" + Definicion.Nombre + "listaaux);"); foreach (Elem elemento in Elementos) escritor.WriteLine("insertarchar(&" + Definicion.Nombre + "listaaux, " + elemento.Valor + ", false);"); /*escritor.If("TienePunterosInvalidoschar(" + Definicion.Nombre + ")"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.FinIf(); escritor.If("ListaCircularchar(" + Definicion.Nombre + ")"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.FinIf(); */ escritor.WriteLine("switch(PunteroInvalidoOListaCircularchar(" + Definicion.Nombre + ")){"); escritor.WriteLine("case listaCircular:"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.WriteLine("case punteroInvalido:"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.WriteLine("}"); escritor.If("!igualdadchar(" + Definicion.Nombre + ", " + Definicion.Nombre + "listaaux)"); escritor.WriteLine(" cantErrores++;"); escritor.FinIf(); break; case Tipo.Int16: case Tipo.UInt16: escritor.WriteLine("struct Listashort *" + Definicion.Nombre + "listaaux;"); escritor.WriteLine("crearshort(&" + Definicion.Nombre + "listaaux);"); foreach (Elem elemento in Elementos) escritor.WriteLine("insertarshort(&" + Definicion.Nombre + "listaaux, " + elemento.Valor + ", false);"); /* escritor.If("TienePunterosInvalidosshort(" + Definicion.Nombre + ")"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.FinIf(); escritor.If("ListaCircularshort(" + Definicion.Nombre + ")"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.FinIf();*/ escritor.WriteLine("switch(PunteroInvalidoOListaCircularshort(" + Definicion.Nombre + ")){"); escritor.WriteLine("case listaCircular:"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.WriteLine("case punteroInvalido:"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.WriteLine("}"); escritor.If("!igualdadshort(" + Definicion.Nombre + ", " + Definicion.Nombre + "listaaux)"); escritor.WriteLine(" cantErrores++;"); escritor.FinIf(); break; case Tipo.UInt32: case Tipo.Int32: escritor.WriteLine("struct Listaint *" + Definicion.Nombre + "listaaux;"); escritor.WriteLine("crearint(&" + Definicion.Nombre + "listaaux);"); foreach (Elem elemento in Elementos) escritor.WriteLine("insertarint(&" + Definicion.Nombre + "listaaux, " + elemento.Valor + ", false);"); /*escritor.If("TienePunterosInvalidosint(" + Definicion.Nombre + ")"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.FinIf(); escritor.If("ListaCircularint(" + Definicion.Nombre + ")"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.FinIf();*/ escritor.WriteLine("switch(PunteroInvalidoOListaCircularint(" + Definicion.Nombre + ")){"); escritor.WriteLine("case listaCircular:"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.WriteLine("case punteroInvalido:"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.WriteLine("}"); escritor.If("!igualdadint(" + Definicion.Nombre + ", " + Definicion.Nombre + "listaaux)"); escritor.WriteLine(" cantErrores++;"); escritor.FinIf(); break; case Tipo.Booleano: escritor.WriteLine("struct Listabool *" + Definicion.Nombre + "listaaux;"); escritor.WriteLine("crearbool(&" + Definicion.Nombre + "listaaux);"); foreach (Elem elemento in Elementos) escritor.WriteLine("insertarbool(&" + Definicion.Nombre + "listaaux, " + elemento.Valor + ", false);"); /*escritor.If("TienePunterosInvalidosbool(" + Definicion.Nombre + ")"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.FinIf(); escritor.If("ListaCircularbool(" + Definicion.Nombre + ")"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.FinIf();*/ escritor.WriteLine("switch(PunteroInvalidoOListaCircularbool(" + Definicion.Nombre + ")){"); escritor.WriteLine("case listaCircular:"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.WriteLine("case punteroInvalido:"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.WriteLine("}"); escritor.If("!igualdadbool(" + Definicion.Nombre + ", " + Definicion.Nombre + "listaaux)"); escritor.WriteLine(" cantErrores++;"); escritor.FinIf(); break; case Tipo.UInt64: case Tipo.Int64: escritor.WriteLine("struct Listalonglong *" + Definicion.Nombre + "listaaux;"); escritor.WriteLine("crearlonglong(&" + Definicion.Nombre + "listaaux);"); foreach (Elem elemento in Elementos) escritor.WriteLine("insertarlonglong(&" + Definicion.Nombre + "listaaux, " + elemento.Valor + ", false);"); escritor.WriteLine("switch(PunteroInvalidoOListaCircularlonglong(" + Definicion.Nombre + ")){"); escritor.WriteLine("case listaCircular:"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.WriteLine("case punteroInvalido:"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.WriteLine("}"); escritor.If("!igualdadlonglong(" + Definicion.Nombre + ", " + Definicion.Nombre + "listaaux)"); escritor.WriteLine(" cantErrores++;"); escritor.FinIf(); break; case Tipo.Float32: escritor.WriteLine("struct Listafloat *" + Definicion.Nombre + "listaaux;"); escritor.WriteLine("crearfloat(&" + Definicion.Nombre + "listaaux);"); foreach (Elem elemento in Elementos) escritor.WriteLine("insertarfloat(&" + Definicion.Nombre + "listaaux, " + elemento.Valor + ", false);"); /*escritor.If("TienePunterosInvalidosfloat(" + Definicion.Nombre + ")"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.FinIf(); escritor.If("ListaCircularfloat(" + Definicion.Nombre + ")"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.FinIf();*/ escritor.WriteLine("switch(PunteroInvalidoOListaCircularfloat(" + Definicion.Nombre + ")){"); escritor.WriteLine("case listaCircular:"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.WriteLine("case punteroInvalido:"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.WriteLine("}"); escritor.If("!igualdadfloat(" + Definicion.Nombre + ", " + Definicion.Nombre + "listaaux," + Definicion.Precision + ")"); escritor.WriteLine(" cantErrores++;"); escritor.FinIf(); break; case Tipo.Float64: escritor.WriteLine("struct Listadouble *" + Definicion.Nombre + "listaaux;"); escritor.WriteLine("creardouble(&" + Definicion.Nombre + "listaaux);"); foreach (Elem elemento in Elementos) escritor.WriteLine("insertardouble(&" + Definicion.Nombre + "listaaux, " + elemento.Valor + ", false);"); /*escritor.If("TienePunterosInvalidosdouble(" + Definicion.Nombre + ")"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.FinIf(); escritor.If("ListaCirculardouble(" + Definicion.Nombre + ")"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.FinIf();*/ escritor.WriteLine("switch(PunteroInvalidoOListaCirculardouble(" + Definicion.Nombre + ")){"); escritor.WriteLine("case listaCircular:"); escritor.PrintListaCircular(); escritor.WriteLine("return 1;"); escritor.WriteLine("case punteroInvalido:"); escritor.PrintPunterosInvalidos(); escritor.WriteLine("return 1;"); escritor.WriteLine("}"); escritor.If("!igualdaddouble(" + Definicion.Nombre + ", " + Definicion.Nombre + "listaaux, " + Definicion.Precision + ")"); escritor.WriteLine(" cantErrores++;"); escritor.FinIf(); break; default: throw new Exception(Mensajes.TipoIncorrectoListas); } }
public override void LiberarMemoria(EscritorC escritor) { switch (Definicion.Tipo) { case Tipo.UInt8: case Tipo.Int8: case Tipo.Char: if (this.Definicion.EntradaSalida != EntradaSalida.E) escritor.WriteLine("liberarchar(&" + Definicion.Nombre + "listaaux);"); escritor.WriteLine("liberarchar(&" + Definicion.Nombre + ");"); break; case Tipo.UInt16: case Tipo.Int16: if (this.Definicion.EntradaSalida != EntradaSalida.E) escritor.WriteLine("liberarshort(&" + Definicion.Nombre + "listaaux);"); escritor.WriteLine("liberarshort(&" + Definicion.Nombre + ");"); break; case Tipo.UInt32: case Tipo.Int32: if (this.Definicion.EntradaSalida != EntradaSalida.E) escritor.WriteLine("liberarint(&" + Definicion.Nombre + "listaaux);"); escritor.WriteLine("liberarint(&" + Definicion.Nombre + ");"); break; case Tipo.Booleano: if (this.Definicion.EntradaSalida != EntradaSalida.E) escritor.WriteLine("liberarbool(&" + Definicion.Nombre + "listaaux);"); escritor.WriteLine("liberarbool(&" + Definicion.Nombre + ");"); break; case Tipo.UInt64: case Tipo.Int64: if (this.Definicion.EntradaSalida != EntradaSalida.E) escritor.WriteLine("liberarlonglong(&" + Definicion.Nombre + "listaaux);"); escritor.WriteLine("liberarlonglong(&" + Definicion.Nombre + ");"); break; case Tipo.Float32: if (this.Definicion.EntradaSalida != EntradaSalida.E) escritor.WriteLine("liberarfloat(&" + Definicion.Nombre + "listaaux);"); escritor.WriteLine("liberarfloat(&" + Definicion.Nombre + ");"); break; case Tipo.Float64: if (this.Definicion.EntradaSalida != EntradaSalida.E) escritor.WriteLine("liberardouble(&" + Definicion.Nombre + "listaaux);"); escritor.WriteLine("liberardouble(&" + Definicion.Nombre + ");"); break; default: throw new Exception(Mensajes.TipoIncorrectoListas); } }
public override void Declarar( EscritorC escritor ) { string declaracion = Definicion.ObtenerNombreDelTipoParaC() + " "; declaracion += "*" + Definicion.Nombre + ";"; escritor.WriteLine( declaracion ); }
public void GenerarPruebas() { EscritorC escritor = new EscritorC( "codigoProbador.c" ); escritor.WriteLine( "#include <stdio.h>" ); escritor.WriteLine("#include \"mallocfree.h\""); escritor.WriteLine("#include \"listas.h\""); escritor.WriteLine( "#define bool int" ); escritor.WriteLine( "#define true 1" ); escritor.WriteLine( "#define false 0" ); escritor.WriteLine( "FILE *fs;" ); EscribirReferenciaExternaDeLaFuncion( escritor ); EscribirFuncionesDePrueba( escritor ); EscribirMain( escritor ); escritor.Close(); }
public override void PedirMemoria( EscritorC escritor ) { string pedido; int cantMemoria; if( Definicion.Tipo!=Tipo.CadenaC && Definicion.Tipo!=Tipo.CadenaPascal ) { cantMemoria = MA.CuantosBytes( Definicion.Tipo ); pedido = Definicion.Nombre + " = " + "malloc2( " + cantMemoria + ",true );"; escritor.WriteLine( pedido ); } }
private void EscribirMain( EscritorC escritor ) { escritor.WriteLine( "int main()" ); escritor.AbrirCorchetes(); if( ContarCantInstrucciones ) { escritor.WriteLine( "/*-----Archivo para contar instrucciones-------*/" ); escritor.WriteLine( "fs = fopen(\" " + ArchivoCuentaInstrucciones + "\", \"w\");" ); escritor.If( "!fs" ); escritor.PrintfNoSePudoAbrirElArchivo( ArchivoCuentaInstrucciones ); escritor.FinIf(); } escritor.WriteLine( "/*------------Parametros-------------------------*/" ); escritor.WriteLine( "int cantErrores = 0;" ); escritor.WriteLine( "/*------------Llamada a pruebas------------------*/" ); foreach( Prueba prueba in Pruebas ) { if( FrenarEnElPrimerError ) escritor.If( "cantErrores == 0" ); escritor.WriteLine( "cantErrores = " + prueba.Nombre + "();" ); if( FrenarEnElPrimerError ) escritor.FinIf(); } if( ContarCantInstrucciones ) escritor.WriteLine( "fclose(fs);" ); escritor.PrintfPruebasConcluidas(); escritor.WriteLine( "return 0;" ); escritor.CerrarCorchetes(); }
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; } }
private void LlamarFuncionAProbar( EscritorC escritor ) { string llamada = ""; if (Definicion.DefParametroSalida != null && Definicion.DefParametroSalida.Tipo != Tipo.Void) llamada = Definicion.DefParametroSalida.Nombre + " = "; llamada += Definicion.Nombre + "( "; foreach( Parametro param in PruebaActual.ParametrosEntrada ) if( param.Definicion.EsLista ) llamada += "&" + param.Definicion.Nombre + ", "; //por referencia else llamada += param.Definicion.Nombre + ", "; if( PruebaActual.ParametrosEntrada.Length > 0 ) //Si hay parametros de entrada llamada = llamada.Remove( llamada.Length - 2, 2 ); //Elimino la última coma.) llamada += " );"; escritor.WriteLine( llamada ); }
public override void Declarar(EscritorC escritor) { string declaracion = string.Empty; switch (Definicion.Tipo) { case Tipo.Char: case Tipo.UInt8: case Tipo.Int8: declaracion = "char "; break; case Tipo.Int16: case Tipo.UInt16: declaracion = "short "; break; case Tipo.UInt32: case Tipo.Int32: declaracion = "int "; break; case Tipo.Booleano: declaracion = "bool "; break; case Tipo.UInt64: case Tipo.Int64: declaracion = "longlong "; break; case Tipo.Float32: declaracion = "float "; break; case Tipo.Float64: declaracion = "double "; break; default: throw new Exception(Mensajes.TipoIncorrectoListas); } declaracion = "struct Lista" + declaracion + " *" + Definicion.Nombre + " = NULL;"; escritor.WriteLine(declaracion); }