Closed PvasquezF closed 3 years ago
let x:number=1-2;
console.log("hi"+x); // hi-1
eso tenemos que hacerlo? o solo con numero positivos?
Como estamos manejando los strings por referencia
let a:string = "Hola";
let b:string = a;
b = "Adios";
En ese caso tambien "a" quedaria con el valor "Adios"? O esto solo aplica cuando son parametros?
let x:number=1-2; console.log("hi"+x); // hi-1
eso tenemos que hacerlo? o solo con numero positivos?
@bmoisesg Si, tambien con decimales, negativos y todo
Como estamos manejando los strings por referencia
let a:string = "Hola"; let b:string = a; b = "Adios";
En ese caso tambien "a" quedaria con el valor "Adios"? O esto solo aplica cuando son parametros?
a sigue con valor "hola" y en parámetros sería igual
el length retorna el tamaño del string, pero de tipo number? cierto? sera uniicamente como expresion?
el length retorna el tamaño del string, pero de tipo number? cierto? sera uniicamente como expresion?
Así es compañero
Cual es el tipo de new Array(Expr)
necesitamos saber su tipo para inicializar los valores por defecto y para hacer verificaciones de tipos:
function foo(a:number[][]){ }
//como puedo verificar que el argumento tiene tipo correcto?
foo(new Array(10));
y para casos como:
let a:number[] = new Array(3);//Aqui tiene ser [0,0,0]
let a:string[] = new Array(3);//Aqui tendria que ser [-1,-1,-1] porque el valor por defecto de string es null
Cual es el tipo de
new Array(Expr)
necesitamos saber su tipo para inicializar los valores por defecto y para hacer verificaciones de tipos:function foo(a:number[][]){ } //como puedo verificar que el argumento tiene tipo correcto? foo(new Array(10));
y para casos como:
let a:number[] = new Array(3);//Aqui tiene ser [0,0,0] let a:string[] = new Array(3);//Aqui tendria que ser [-1,-1,-1] porque el valor por defecto de string es null
@javier3448 No tiene un tipo definido, solo es un espacio de memoria que se reserva en el heap, el tipo ya se define al momento de asignarlo algo.
Para el primer caso haces la comparacion de que el parametro que se recibe es un arreglo de 2 dimensiones de tipo number y el parametro que enviaste es un new Array de 5 posiciones, como el arreglo es de 2 dimensiones lo que haces es llenar esas 5 posiciones de nulos.
Cual es el tipo de
new Array(Expr)
necesitamos saber su tipo para inicializar los valores por defecto y para hacer verificaciones de tipos:function foo(a:number[][]){ } //como puedo verificar que el argumento tiene tipo correcto? foo(new Array(10));
y para casos como:
let a:number[] = new Array(3);//Aqui tiene ser [0,0,0] let a:string[] = new Array(3);//Aqui tendria que ser [-1,-1,-1] porque el valor por defecto de string es null
@javier3448 No tiene un tipo definido, solo es un espacio de memoria que se reserva en el heap, el tipo ya se define al momento de asignarlo algo.
Para el primer caso haces la comparacion de que el parametro que se recibe es un arreglo de 2 dimensiones de tipo number y el parametro que enviaste es un new Array de 5 posiciones, como el arreglo es de 2 dimensiones lo que haces es llenar esas 5 posiciones de nulos.
Es que lo complica todo porque ahora, donde sea que compilemos una expresion no podemos asegurarnos que ya tenga generado su c3d y que sepamos exactamente su tipo. Entonces si estamos compilando otra expression que acepte varios tipos (como el operador +
o el console.log()
) esa expresion tambien tiene tipo y c3d ambiguo.
Esa ambiguedad se propaga hasta que eventualmente logremos inferir el tipo de la expresion. Solo ahi podemos generar y agregar el codigo de 3 direcciones de todas sus sub expresiones.
Y hay casos en los que simplemente nunca podemos inferir el tipo y queda ambiguo como en el ultimo console.log
de abajo
No es imposible, lenguajes como SML tienen algo asi (que yo sepa) para su sistema de tipos porque ahi todos los tipos se infieren, pero si es mucho mas complejo, no se si esa era la intencion
Talvez podriamos limitar que el new Array(3)
solo pueda venir en declaraciones o
cambiarlo por new Array<aType>()
o algo asi para que no quede tan complicado el sistema de tipos.
//podriamos estar operando boolean + number o number + boolean
let b:number = (new Array(5))[1] + (new Array(5))[1];
let d:string = "" + (new Array(5))[0];//podria ser false o 0 o null
//no deberia de dar error de tipos porque uno o mas de los dos operandos de la suma podria ser un string
let e:string = (new Array(5))[1] + (new Array(5))[1];
let f:number = (new Array(5))[1][1][1][1][1][1][1][1];//no deberia ser error de tipos
type Foo = { a:number };
let g:Foo = null;
if(g == (new Array(5))[3]){//deberia ser true?
}
//Podria imprimir null, 0, false o hasta dar error de compilacion
console.log((new Array(3))[2]);
Cual es el tipo de
new Array(Expr)
necesitamos saber su tipo para inicializar los valores por defecto y para hacer verificaciones de tipos:function foo(a:number[][]){ } //como puedo verificar que el argumento tiene tipo correcto? foo(new Array(10));
y para casos como:
let a:number[] = new Array(3);//Aqui tiene ser [0,0,0] let a:string[] = new Array(3);//Aqui tendria que ser [-1,-1,-1] porque el valor por defecto de string es null
@javier3448 No tiene un tipo definido, solo es un espacio de memoria que se reserva en el heap, el tipo ya se define al momento de asignarlo algo. Para el primer caso haces la comparacion de que el parametro que se recibe es un arreglo de 2 dimensiones de tipo number y el parametro que enviaste es un new Array de 5 posiciones, como el arreglo es de 2 dimensiones lo que haces es llenar esas 5 posiciones de nulos.
Es que lo complica todo porque ahora, donde sea que compilemos una expresion no podemos asegurarnos que ya tenga generado su c3d y que sepamos exactamente su tipo. Entonces si estamos compilando otra expression que acepte varios tipos (como el operador
+
o elconsole.log()
) esa expresion tambien tiene tipo y c3d ambiguo.Esa ambiguedad se propaga hasta que eventualmente logremos inferir el tipo de la expresion. Solo ahi podemos generar y agregar el codigo de 3 direcciones de todas sus sub expresiones. Y hay casos en los que simplemente nunca podemos inferir el tipo y queda ambiguo como en el ultimo
console.log
de abajoNo es imposible, lenguajes como SML tienen algo asi (que yo sepa) para su sistema de tipos porque ahi todos los tipos se infieren, pero si es mucho mas complejo, no se si esa era la intencion
Talvez podriamos limitar que el
new Array(3)
solo pueda venir en declaraciones o cambiarlo pornew Array<aType>()
o algo asi para que no quede tan complicado el sistema de tipos.//podriamos estar operando boolean + number o number + boolean let b:number = (new Array(5))[1] + (new Array(5))[1]; let d:string = "" + (new Array(5))[0];//podria ser false o 0 o null //no deberia de dar error de tipos porque uno o mas de los dos operandos de la suma podria ser un string let e:string = (new Array(5))[1] + (new Array(5))[1]; let f:number = (new Array(5))[1][1][1][1][1][1][1][1];//no deberia ser error de tipos type Foo = { a:number }; let g:Foo = null; if(g == (new Array(5))[3]){//deberia ser true? } //Podria imprimir null, 0, false o hasta dar error de compilacion console.log((new Array(3))[2]);
@javier3448 Como te comenté arriba, no tiene un tipo definido solo reserva un espacio de memoria, por lo que ninguna operación de las que mencionaste podría ser realizada
El ternario puede tener en sus operaciones verdaderas y falsas tipos iguales o diferentes ya que como es traduccion no sabesmos si la condicion sera verdadera o falsa y teniendo diferentes tipos ejemplo en una impresion si se usan funciones nativas no sabriamos distinguir cual usar
ejemplo console.log( 1 > 2 ? "hola : 2*2)
aqui si la condicion es falsa imprimiriamos un numero, pero si es verdadera imprimiria un texto
El ternario puede tener en sus operaciones verdaderas y falsas tipos iguales o diferentes ya que como es traduccion no sabesmos si la condicion sera verdadera o falsa y teniendo diferentes tipos ejemplo en una impresion si se usan funciones nativas no sabriamos distinguir cual usar
ejemplo console.log( 1 > 2 ? "hola : 2*2)
aqui si la condicion es falsa imprimiriamos un numero, pero si es verdadera imprimiria un texto
@wiicho57x Tienen que ser los mismos tipos de dato
si tenemos console.log("hola".charAt(0)) que debemos de imprimir en consola el ascci que seria el que recuperamos que representa a la h o bien el caracter como tal esto porque se podria hacer una concatenación en ese console.log o en cualquier operacion
si tenemos console.log("hola".charAt(0)) que debemos de imprimir en consola el ascci que seria el que recuperamos que representa a la h o bien el caracter como tal esto porque se podria hacer una concatenación en ese console.log o en cualquier operacion
@wiicho57x La letra h Ejemplo:
console.log("hola".charAt(0) + "hola".charAt(1)); //Esto imprime: ho
Para los metodos de los strings, esto seria valido
"hola".charAt(e);
"hola".length;
"hola".concat(" mundo");
let cadena:string = "hola";
let cadena2:string = " mundo";
cadena.charAt(e);
cadena.length;
cadena.concat(cadena2);
para el método de concat, su parámetro solo puede ser otro string?
Para los metodos de los strings, esto seria valido
"hola".charAt(e); "hola".length; "hola".concat(" mundo"); let cadena:string = "hola"; let cadena2:string = " mundo"; cadena.charAt(e); cadena.length; cadena.concat(cadena2);
@EverChicas201403532
Si será valido, tomar en cuenta que los métodos no cambian el valor actual de las variables sino que retornan un nuevo valor Ej:
let cadena1 : string = "hola";
let cadena2 : string = "adios";
cadena1.concat(cadena2); //No cambia el valor de cadena1
let cadena3 : string = cadena1.concat(cadena2); //Cadena3 tiene valor de "holaadios"
Exacto, solo otro string
A que se refieren con eso, pueden dar un ejemplo?
A que se refieren con eso, pueden dar un ejemplo?
@EverChicas201403532 A que su implementación en código intermedio para operaciones lógicas y relacionales sean únicamente con comparaciones y etiquetas de salto, sin ningún uso de temporales, es ponderación adicional.
Si sus operaciones lógicas y relacionales están correctas tienen los dos puntos de esa sección y si las implementaron de esa manera tienen los otros 4 puntos.
@erflod5
t65 = 3 + 3;
if(t65 > 5) goto L29;
goto L30;
L29:
if(6 < 9) goto L31;
goto L32;
L31:
if(1 == 1) goto L33;
goto L34;
if(1 == 1) goto L36;
goto L37;
Esto aplica para tener esos puntos?
A que se refieren con eso, pueden dar un ejemplo?
@EverChicas201403532 A que su implementación en código intermedio para operaciones lógicas y relacionales sean únicamente con comparaciones y etiquetas de salto, sin ningún uso de temporales, es ponderación adicional.
Si sus operaciones lógicas y relacionales están correctas tienen los dos puntos de esa sección y si las implementaron de esa manera tienen los otros 4 puntos.
@EverChicas201403532 Cual sería la entrada en alto nivel de esa traducción?
@erflod5 Seria esta:
if((3+3)>5 && 6<9){
console.log(true);
}else{
console.log(false);
}
Cual sería la entrada en alto nivel de esa traducción?
El operador ==
y !=
que tiene que hacer cuando se comparan Strings?
El operador
==
y!=
que tiene que hacer cuando se comparan Strings?
@javier3448 comparar caracter por caracter
El operador == y != aplicado a types , compara la referencia o solo el tipo del type ?
El operador == y != aplicado a types , compara la referencia o solo el tipo del type ?
@CristianFrancisco85 La referencia
Buenas tengo una duda acerca de las expresiones supuestamente cuando en un expresión viene un operador lógico hay que utilizar corto circuito pero tratando de hacer el console me di cuenta que el console también acepta booleanos por lo que yo pienso que tambien vendran operadores lógicos y relacionales mi duda es si hay q hacer corto circuito con esos operadores como convierto corto circuito en valores booleanos para ser impresos con el console o para ser concatenados en cadenas o asignados en variables sin utilizar temporales
ejemplo en un if si habria q hacer saltos condicionales if(true && true){}
pero en un console console.log(true && true); aqui no se podría hacer corto circuito
o en una asignación de variable let a:boolean = true && true; aqui no se podría hacer corto circuito
cómo convertir eso en una concatenación si fuera el caso let b: string = 'cadena' + (true && true);
al no utilizar temporales para guardar esas operación no seria posible ni asignar ni concatenar
@edwinlg17 Si se puede compañero, en el caso del console.log el corto circuito lo que haría es que en la etiqueta verdadera haces un print de true y en la etiqueta falsa un print de false, para la asignación guardas la variable con su valor por defecto para true y false
Segun la regla 4 si el resultado de la condicion es falso debemos aplicar esta regla de optimizacion. pero en nuestro caso que no estamos ejecutando el codigo no sabriamos cual es el resultado a menos que ejecutemos el condiciona por lo que no se si aplicaria esto o como se puede saber si el resultado es falso
Segun la regla 4 si el resultado de la condicion es falso debemos aplicar esta regla de optimizacion. pero en nuestro caso que no estamos ejecutando el codigo no sabriamos cual es el resultado a menos que ejecutemos el condiciona por lo que no se si aplicaria esto o como se puede saber si el resultado es falso
@wiicho57x Estas reglas aplican para valores constantes, ya que 5 y 1 son valores constantes no se necesita ejecutar código para saber que la condición nunca será verdadera
Con esto se refieren a que el switch puede evaluar solo booleanos y numeros? y no cadenas u otro tipo de cosas.
Estos ya no son validos para este proyecto? pregunto por el motivo que de esa forma no se conoce el tipo del arreglo
for(let item in [1,2,3,4,5]){
console.log(item);
}
for(let item of [1,2,3,4,5]){
console.log(item);
}
var multi:number[][] = [[1,2,3],[23,24,2],[23,24,25,4],[19]]
esto se puede? esque segun yo tendria que ser del mismo tamaño, al 19 le faltan 2 elementos y el elemento 4 esta de mas
o caso este es un ejemplo de un array de arrays? porque yo lo estoy viendo como una matriz n*m
Tengo una duda, en el archivo de aclaraciones vi que agregaron que ahora se debe de trabajar con double, pero si yo ya estoy trabajando con float y creo que no tengo problemas lo puedo seguir trabajando así?
Tengo una duda, en el archivo de aclaraciones vi que agregaron que ahora se debe de trabajar con double, pero si yo ya estoy trabajando con float y creo que no tengo problemas lo puedo seguir trabajando así?
@EverChicas201403532 Si compañero, si no te da ningún problema podes usar float
¿Se pueden definir las funciones al principio de código después de la declaraciones de los temporales en C ? Por ejemplo: void funcion(void);
Estos ya no son validos para este proyecto? pregunto por el motivo que de esa forma no se conoce el tipo del arreglo
for(let item in [1,2,3,4,5]){ console.log(item); } for(let item of [1,2,3,4,5]){ console.log(item); }
@EverChicas201403532 Si son validos y si se puede conocer el tipo del arreglo
Con esto se refieren a que el switch puede evaluar solo booleanos y numeros? y no cadenas u otro tipo de cosas.
@EddieAlvarez01 asi es compañero
¿Se pueden definir las funciones al principio de código después de la declaraciones de los temporales en C ? Por ejemplo: void funcion(void);
@bchacon45 Te da algún problema el no hacerlo?
¿Se pueden definir las funciones al principio de código después de la declaraciones de los temporales en C ? Por ejemplo: void funcion(void);
@bchacon45 Te da algún problema el no hacerlo?
El compilador de C me lanza warnings debido a que toma como conflicto el no declarar o definir las funciones antes de usarlas.
Que tal! Con una consulta sobre los reporte de optimizacion. Entiendo que tanto en el reporte de bloques, como en el de mirilla se tiene que hacer una lista de las optimizaciones hechas con el codigo antiguo, el codigo nuevo, la regla aplicada y la linea.
Sin embargo, queria saber que diferencia habra entre el reporte de la optimizacion por bloques y el de mirilla, o si visualmente sera el mismo solo que con diferente nombre. O no se si hay que mostrar los bloques optimizados o todos los bloques. Gracias!
Buenas noches! Con una consulta. Quisiera saber qué podría hacer para detener una ejecución en el programa cuando encuentre un error en ejecución. Había pensado en una etiqueta al final del metodo main y saltar ahí cuando encontrara el error, pero C no deja saltar a etiquetas que esten en otra función.
Buenas noches! Con una consulta. Quisiera saber qué podría hacer para detener una ejecución en el programa cuando encuentre un error en ejecución. Había pensado en una etiqueta al final del metodo main y saltar ahí cuando encontrara el error, pero C no deja saltar a etiquetas que esten en otra función.
exit(1);
pero tenes que incluir stdlib.h
no se si dejan.
O podrias forzar un segfault. con algo como stack[1000000000000000]
pero eso creo que no estaria garantizado a crashear simpre.
desreferencia null seria tambien buena idea pero no se si esta permitido. algo como *(int*)0 = 0;
Tambien podrias hacer assert(0)
pero tendrias que incluir assert.h
. Ese header no define nada mas (que yo sepa), entonces fijo no lo podriamos usar para hacer trampa, pero igual seria de ver que dicen los aux.
Buenas noches! Con una consulta. Quisiera saber qué podría hacer para detener una ejecución en el programa cuando encuentre un error en ejecución. Había pensado en una etiqueta al final del metodo main y saltar ahí cuando encontrara el error, pero C no deja saltar a etiquetas que esten en otra función.
exit(1);
pero tenes que incluir
stdlib.h
no se si dejan. O podrias forzar un segfault. con algo comostack[1000000000000000]
pero eso creo que no estaria garantizado a crashear simpre. desreferencia null seria tambien buena idea pero no se si esta permitido. algo como*(int*)0 = 0;
Tambien podrias hacer
assert(0)
pero tendrias que incluirassert.h
. Ese header no define nada mas (que yo sepa), entonces fijo no lo podriamos usar para hacer trampa, pero igual seria de ver que dicen los aux.
Compañero, que usaste en fin? No han contestado jajaja y ya no hay mucho tiempo.
Buenas noches! Con una consulta. Quisiera saber qué podría hacer para detener una ejecución en el programa cuando encuentre un error en ejecución. Había pensado en una etiqueta al final del metodo main y saltar ahí cuando encontrara el error, pero C no deja saltar a etiquetas que esten en otra función.
exit(1);
pero tenes que incluir
stdlib.h
no se si dejan. O podrias forzar un segfault. con algo comostack[1000000000000000]
pero eso creo que no estaria garantizado a crashear simpre. desreferencia null seria tambien buena idea pero no se si esta permitido. algo como*(int*)0 = 0;
Tambien podrias hacerassert(0)
pero tendrias que incluirassert.h
. Ese header no define nada mas (que yo sepa), entonces fijo no lo podriamos usar para hacer trampa, pero igual seria de ver que dicen los aux.Compañero, que usaste en fin? No han contestado jajaja y ya no hay mucho tiempo.
No reporto errores de runtime . muy dificil :/
Regla 5 Si existe una asignación de valor de la forma a = b y posteriormente existe una asignación de forma b = a, se eliminará la segunda asignación siempre que a no haya cambiado su valor. Se deberá tener la seguridad de que no exista el cambio de valor y no existan etiquetas entre las 2 asignaciones
que tanto del codigo tenemos que visitar antes que podamos determinar que no existe la asignacion b = a?
Dudas semana 2