PvasquezF / ArchivosPruebaOLC2

Aquí se van a almacenar archivos de pruebas para los proyectos
6 stars 32 forks source link

Dudas de proyecto 2 - Semana 2 #56

Closed PvasquezF closed 3 years ago

PvasquezF commented 3 years ago

Dudas semana 2

bmoisesg commented 3 years ago
let x:number=1-2;
console.log("hi"+x);  // hi-1     

eso tenemos que hacerlo? o solo con numero positivos?

pablorocad commented 3 years ago

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?

erflod5 commented 3 years ago
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

erflod5 commented 3 years ago

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

bmoisesg commented 3 years ago

el length retorna el tamaño del string, pero de tipo number? cierto? sera uniicamente como expresion?

erflod5 commented 3 years ago

el length retorna el tamaño del string, pero de tipo number? cierto? sera uniicamente como expresion?

Así es compañero

javier3448 commented 3 years ago

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
erflod5 commented 3 years ago

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.

javier3448 commented 3 years ago

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]);
erflod5 commented 3 years ago

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]);

@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

wiicho57x commented 3 years ago

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

erflod5 commented 3 years ago

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

wiicho57x commented 3 years ago

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

erflod5 commented 3 years ago

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

echicasprado2 commented 3 years ago

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);
echicasprado2 commented 3 years ago

para el método de concat, su parámetro solo puede ser otro string?

erflod5 commented 3 years ago

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

  1. 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"
  2. Exacto, solo otro string

echicasprado2 commented 3 years ago

image A que se refieren con eso, pueden dar un ejemplo?

erflod5 commented 3 years ago

image 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.

echicasprado2 commented 3 years ago

@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?

image 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 commented 3 years ago

@EverChicas201403532 Cual sería la entrada en alto nivel de esa traducción?

echicasprado2 commented 3 years ago

@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?

javier3448 commented 3 years ago

El operador == y != que tiene que hacer cuando se comparan Strings?

erflod5 commented 3 years ago

El operador == y != que tiene que hacer cuando se comparan Strings?

@javier3448 comparar caracter por caracter

CristianFrancisco85 commented 3 years ago

El operador == y != aplicado a types , compara la referencia o solo el tipo del type ?

erflod5 commented 3 years ago

El operador == y != aplicado a types , compara la referencia o solo el tipo del type ?

@CristianFrancisco85 La referencia

edwinlg17 commented 3 years ago

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

erflod5 commented 3 years ago

@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

wiicho57x commented 3 years ago

image

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

erflod5 commented 3 years ago

image

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

EddieAlvarez01 commented 3 years ago

image Con esto se refieren a que el switch puede evaluar solo booleanos y numeros? y no cadenas u otro tipo de cosas.

echicasprado2 commented 3 years ago

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);
}
bmoisesg commented 3 years ago
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

echicasprado2 commented 3 years ago

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í?

erflod5 commented 3 years ago

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

bchacon45 commented 3 years ago

¿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);

erflod5 commented 3 years ago

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

erflod5 commented 3 years ago

image 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

erflod5 commented 3 years ago

¿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?

bchacon45 commented 3 years ago

¿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.

marckomatic commented 3 years ago

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!

marckomatic commented 3 years ago

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.

javier3448 commented 3 years ago

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.

marckomatic commented 3 years ago

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.

Compañero, que usaste en fin? No han contestado jajaja y ya no hay mucho tiempo.

javier3448 commented 3 years ago

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.

Compañero, que usaste en fin? No han contestado jajaja y ya no hay mucho tiempo.

No reporto errores de runtime . muy dificil :/

javier3448 commented 3 years ago

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?