Errores, fallos, preguntas - página 2046

 
Alexey Viktorov:

Esta inicialización es posible. Porque la variable 'a' se inicializa con una constante, y la variable 'b' se inicializa con una expresión constante.

Aquí 'b' se inicializa NO por una expresión constante. Por eso contradice las reglas descritas en la documentación.

Elproblema es que cuando unavariable estática es inicializada por una función, la inicialización se "pausa" y la función se ejecuta. En el ejemplo anterior, hay una variable estática en esa función que aún no ha sido inicializada. Por lo tanto, una variable inicializada por una función toma un valor diferente.

Pero, ¿cómo se puede pausar la inicialización? Todas las operaciones se ejecutan en un orden estricto definido por la sintaxis del lenguaje. Primero, se ejecuta la función, y luego el valor devuelto de esta función se pasa al constructor de nuestra variable - esto se llama inicialización. Pero la operación de inicialización es descaradamente ignorada por el compilador en este caso, y el código sigue compilando como si no hubiera pasado nada. Esto es inaceptable. Es lo mismo que si, por ejemplo, declaras la siguiente matriz int a[]= { f(), g(), h() }; y compilaría, pero por supuesto sin inicializar nada.

 
A100:

En el terminal de 32 bits un error en cualquier OPTIMIZE

Real. Comprobado en MT4, efectivamente hay errores de cualquier tipo. Y cómo la gente codifica algo allí en las nuevas construcciones
 
Alexey Navoykov:

'b' aquí se inicializa con NO una expresión constante. Por lo tanto, va en contra de las normas descritas en la documentación.

¿Cómo se puede pausar la inicialización? Todas las operaciones se realizan en un orden estricto definido por la sintaxis del lenguaje. Primero, se ejecuta la función, y luego el valor devuelto de esta función se pasa al constructor de nuestra variable - esto se llama inicialización. Pero la operación de inicialización es descaradamente ignorada por el compilador en este caso, y el código sigue compilando como si no hubiera pasado nada. Esto es inaceptable. Es lo mismo que si, por ejemplo, declaras el siguiente arrayint a[]= { f(), g(), h() }; y compilaría, pero por supuesto sin inicializar nada.

Si no es por una expresión constante, ¿entonces por QUÉ?

Alexey, es más fácil si tomas ese código tú mismo y miras la secuencia de inicialización en el depurador. Además, no me di cuenta inmediatamente de que el código del

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bichos, errores, preguntas

Alexey Navoykov, 2017.10.17 20:31

Y aquí hay más sobre el tema de la inicialización de variables. Si sigues lo mencionado en la documentación, entonces no puedes referenciar otras variables globales/estáticas también. Como no es una expresión constante:

int a= 1;
int b= a+1;  // Согласно документации, такая инициализация не возможна

void OnStart()
{
  Print(b);
}

Sin embargo, por ahora funciona. Y supongo que mucha gente siempre ha utilizado este tipo de construcciones sin darse cuenta. Pero resulta que los desarrolladores pueden desactivarlo en cualquier momento. Y como en el caso de la inicialización de funciones, estos códigos seguirán compilando con éxito, pero no funcionarán correctamente. Así, todo el código MQL es una bomba de relojería.


Son las variables de nivel global, no las estáticas situadas dentro de cualquier función.

No tengo suficientes conocimientos para explicarlo, y tú no estás lo suficientemente atento. ¡¡ "suspendido" entre comillas!!

No hay que confundir la inicialización de las variables estáticas con la de las ordinarias, y más aún si se trata de variables locales.

 
Alexey Viktorov:

Si no es por una expresión constante, ¿entonces por qué?

Una expresión no constante.

Además, no me di cuenta inmediatamente El punto principal es que este ejemplo habla de variables de nivel global y no de las estáticas ubicadas dentro de cualquier función.

No tengo suficientes conocimientos para explicarlo de forma clara, y no tienes la capacidad de atención...

¿No estás confundiendo algo?

Además, las variables globales y estáticas se comportan de forma absolutamente idéntica. Aquí está la documentación:

Una variable global sólo puede ser inicializada por una constante o una expresión constante correspondiente a su tipo.

Tengo que confesar que fue una revelación tanto para mí como para las variables estáticas. No sé cuándo apareció todo esto en la documentación o quizás fue antes, pero nadie le prestó atención, porque todo funcionaba realmente como en C++, así que no surgieron preguntas.

 
Alexey Navoykov:

Una expresión no constante.

¿No estás confundiendo las cosas?

Además, las variables globales y estáticas se comportan exactamente igual. Aquí hay algo de la documentación:

Tengo que confesar que esto fue una revelación para mí como lo fue con las variables estáticas. No sé cuándo apareció todo esto en la documentación y tal vez fue antes pero nadie le prestó atención ya que todo funcionaba realmente en C++ y por lo tanto no surgieron preguntas.

Creo que está absolutamente equivocado. Cómo se puede hablar de la identidad de las variables, si algunas están disponibles en todas las funciones definidas en el programa y otras sólo en la función en la que se declaran.

Y la diferencia entre las variables estáticas y las locales es que las estáticas se inicializan inmediatamente después de las globales, y las locales ordinarias (no estáticas) a medida que se ejecuta el programa, cuando el código llega a ellas.

 
Alexey Viktorov:

Me parece que estás completamente equivocado. Cómo se puede hablar de que las variables son idénticas si algunas son accesibles desde todas las funciones definidas en el programa, y otras sólo en la función en la que se declaran.

Estabas hablando del contexto específico de la discusión(inicialización de variables), no en general.

 
Después de enviar mensajes a través del chat completo, el mensaje enviado no se añade automáticamente al historial de chat de la página actual.
El mensaje enviado sólo aparece después de recargar la página.

Sólo un vistazo rápido, la respuesta del servidor al enviar el mensaje es adecuada, tal vez algo salió mal en los manejadores de eventos en el código js.
 
Alexey Navoykov:

Se trataba del contexto específico de la discusión(inicialización de variables), no en general.

Por lo que recuerdo se trataba de inicializar una variable ESTÁTICA

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bichos, errores, preguntas

Alexey Navoykov, 2017.10.17 17:16

Error en la inicialización de variables estáticas. No estaba presente en las construcciones antiguas.

class A
{
 public:
  static int f()
  { 
    static int a=1;
    Print(a);       // Получаем a=0 !!
    return a;  
  }   
};


int a= A::f();


void OnStart()
  {
   
  }

A quien no le importe, que lo envíe al servicio técnico. Ya no tengo ningún deseo de comunicarme con ellos allí.


¿O no es este su mensaje?

Resuelve ya la secuencia de inicialización de las variables. En este ejemplo se inicializa primero una variable global

int a= A::f();

que llama a una función que aún no ha inicializado una variable del mismo nombre.

static int a=1;

Y de qué podemos hablar si no se presta atención a las advertencias del compilador...


 
Alexey Navoykov:

Pero ahí puse la dimensión del array mal, quizás lo afectó de alguna manera (aunque no debería afectarlo en absoluto).

Pruebe esto con dimensión = 3

Gracias por el mensaje.
Efectivamente, es un error del optimizador del compilador.
La corrección se incluirá en la próxima versión.
 
Alexey Viktorov:

Por lo que recuerdo se trataba de inicializar una variable ESTÁTICA

¿O no es ese su mensaje?

No entiendo lo que quieres. Dije que se trataba de la "inicialización de variables". Y en este contexto las variables estáticas y globales se comportan de forma idéntica. Incluso te he dado un enlace a la documentación:inicialización de variables

Obsérvese que las variables estáticas y globales están juntas en todas partes.

Y no criticamos la secuencia de inicialización porque no está relacionada con el problema en cuestión. Te recuerdo que el problema es que el compilador NO genera un error donde debería. Si una variable estática está sin inicializar, no se puede acceder a ella.

Y de qué podemos hablar si ignoras las advertencias del compilador...

Bueno, cambia el nombre de la variable global, si te molesta tanto. No afectará al resultado.

Razón de la queja: