Errores, fallos, preguntas - página 312

 
Academic:

Esta advertencia no debería darse, porque la función ObjectGetDouble pasa una referencia y la sentencia if comprueba la verdad devuelta por ambas llamadas, y por lo tanto, sólo si ambas funciones devuelven verdadero entonces estas variables son manejadas, lo que significa que ambas variables no pueden ser no establecidas al valor correcto.


El compilador no se extiende tanto para asegurarse de que estas variables serán necesariamente inicializadas como resultado de una llamada a ObjectGetDouble. Intente escribir su propia variable en su lugar, donde el valor del parámetro de entrada pasado por referencia se establecerá explícitamente. ¿Qué dirá el compilador?
 
Rosh:
El compilador no expande su mente lo suficiente como para asegurarse de que estas variables serán necesariamente inicializadas como resultado de una llamada a ObjectGetDouble. Intente escribir el suyo propio en su lugar, donde el valor del parámetro de entrada pasado por referencia se establecerá explícitamente. ¿Qué dirá el compilador?


Rashid, en realidad no se trata de "conciencia", sino de matemáticas.

 
Academic:


Rashid, en realidad no se trata de "conciencia", sino de matemáticas.

1. Existe el concepto de "evaluación abreviada de expresiones lógicas".

2. El compilador no puede saber con seguridad si la variable pasada por referencia será rellenada.

3. Una advertencia es sólo eso, una advertencia para llamar su atención sobre la posibilidad de un problema.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип bool - Документация по MQL5
 
Academic:


Rashid, en realidad no se trata de "conciencia", sino de matemáticas.

Bien, definamos dicha fusión

bool AlwaysGood( double & param)
  {
   return true;
  }
¿Hay alguna garantía de que la variable param se inicialice?
 
Rosh:

Bien, definamos una función de este tipo

¿Hay alguna garantía de que la variable param será inicializada?

Se trata de una función en la que el resultado "param" NO se modifica. Así que aquí la advertencia debe ser dada al 1000% :)

La solución estándar en este caso es la siguiente: si hay una rama de ejecución de código en la que no se puede cambiar el valor, se considera que esta función no cambia el valor. Y generará una advertencia.

Rashid, ¿quieres que coja cualquiera de los compiladores modernos de C++ y C y compile dicho código y estoy seguro de que ninguno de ellos dará un aviso de izquierda.

Además, si tienes esos "problemas" con la detección de esas cosas, de repente empiezas a tener una duda muy fuerte de que no hay ninguna optimización como tal. ¿O no?

 
Academic:

Rashid, quieres que coja cualquiera de los compiladores modernos de C++ y C y compile un código similar y estoy seguro de que ninguno dará un aviso de izquierda.

¿De qué estamos discutiendo? w0 no ponen

PS Definitivamente habrá un mensaje (tal vez unas líneas más abajo)

 
Academic:

Está claro que esto no es una mejora, sobre todo si hay tales "problemas" con la detección de tales cosas, entonces se asoma una GRAN duda de que no hay ninguna optimización como tal. ¿O no?

La función ObjectGetDouble está fuera del control del compilador porque tiene una implementación independiente (es decir, de biblioteca)
Документация по MQL5: Графические объекты / ObjectGetDouble
Документация по MQL5: Графические объекты / ObjectGetDouble
  • www.mql5.com
Графические объекты / ObjectGetDouble - Документация по MQL5
 
Academic:


Si miras la ayuda de ObjectGetDouble:


Devuelve true o false dependiendo del éxito de la función. Si tiene éxito, el valor de la propiedad se coloca en la variable de destino, pasada por referencia por el último parámetro.


Por lo tanto, concluimos que el llenado de la variable de recepción no está garantizado en caso de cualquier error. Por eso el mensaje del compilador es válido.

EN MI OPINIÓN.

 

Algo no está sincronizado en la última versión.

Haciendo un pequeño EA:

int OnInit()
  {
   Print("Все нормально!"); 
   return(0);
  }

Ejecutando el probador,

2011.02.22 11:54:21 Core 1 2011.02.07 00:00:00 ¡Todo está bien!

Hago cambios en mi EA:

int OnInit()
  {
   Print("Тестер, Аууу, ты где?"); 
   return(0);
  }

Lo compilo, ejecuto el probador y responde:

2011.02.22 11:57:55 Core 1 2011.02.07 00:00:00 ¡Todo normal!

Sólo ayuda a reiniciar el terminal.

 
Serj_Che:

Algo no está sincronizado en la última versión.

Haciendo un pequeño EA:

Ejecutando el probador,

2011.02.22 11:54:21 Core 1 2011.02.07 00:00:00 ¡Todo está bien!

Hago cambios en mi EA:

Lo compilo, ejecuto el probador y responde:

2011.02.22 11:57:55 Core 1 2011.02.07 00:00:00 ¡Todo normal!

Sólo ayuda a reiniciar el terminal.

Lo siento. Hoy o mañana se publicará una nueva versión sin este desafortunado error.