Errores, fallos, preguntas - página 2045

 

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

template<typename T>
int F1(const T& array[]) { return ArrayMaximum(array); }

template<typename T>
int F2(const T& array[]) { return F1(array); }

void OnStart()
  {
    int arr[3]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }
 

Descubierta la causa de la discrepancia. Con OPTIMIZE=0 hay un error, pero no con OPTIMIZE=1. Normalmente sólo uso OPTIMIZE=0

 
fxsaber:

Si encuentro una explicación lógica (no contradictoria) para el resultado, no veo el fallo. No creo que sea aceptable probar un error si el resultado no coincide con C++. Está en C++ que alguien pensó así y lo hizo. Pero puede que no lo hayan pensado y por eso no lo hayan hecho. Por eso es mejor no referirse a algo de fuera, sino confiar en tu propio concepto interno de lo que debe ser. Y es deseable que ese "propio" sea realmente propio. No es el resultado de la imposición imperceptible de estereotipos "como debe ser" a medida que se gana experiencia en programación.

Si no tiene su propia explicación, significa que no hay ningún error. Y si esta explicación aparece un año después y es bastante convincente, ¿habrá que rehacer todo? En C++ ya han pensado cien veces por qué se hace así y no así. Y la explicación es necesaria si algo se configura de forma diferente en MQL que en C++ y no al revés.

 
Alexey Viktorov:
Una variable estática puede inicializarse con una constante o expresión constante correspondiente a su tipo , a diferencia de una simple variable local, que puede inicializarse con cualquier expresión.


Pero no una función.

Entonces las instancias de clases estáticas deberían estar prohibidas - porque son inicializadas por una función constructora

 

Y aquí hay más sobre el tema de la inicialización de variables. Si sigues lo indicado en la documentación, tampoco puedes referenciar otras variables globales/estáticas. 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. En definitiva, todo el MQL es una bomba de relojería.

 
Alexey Navoykov:

Y aquí hay otra cosa relativa a la inicialización de variables. Si sigues lo indicado en la documentación, tampoco puedes referenciar otras variables globales/estáticas. Porque no es una expresión constante:

//+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
CExpert ExtExpert;

se inicializa mediante una función constructora - ¡prohibir!

Esto es si se resumen lógicamente los últimos posts

Alexey Navoykov:

Descubrí la razón de la discrepancia. Con OPTIMIZE=0 hay un error, pero no con OPTIMIZE=1. Yo siempre uso sólo OPTIMIZE=0.

En el terminal de 32 bits se produce un error en cualquier OPTIMIZE

int g1( int& t[] ) { return ArraySize( t ); }
int g2( int& t[] ) { return g1( t ); }
void OnStart()
{
        int t[] = { 1, 2, 3, 4, 5 }; //всего 5
        Print( g2(t)); //Результат:          3
}
 
A100:

se inicializa mediante una función constructora - ¡prohibir!

Esto es si se resumen lógicamente los últimos posts

Bueno, la persona acaba de expresarlo incorrectamente allí. Por supuesto, estamos hablando de un valor de inicialización, no de una función de inicialización.


Y qué demonios con ellos: prohibiciones. No causan problemas por sí mismos. Pero cuando esta prohibición no está controlada por el compilador de ninguna manera, sino que genera un algoritmo que se salta las reglas del lenguaje, no encaja en absoluto. Ahora tendrás que rebuscar en todo el código en busca de esas cosas y estar constantemente en guardia. Bueno, a la mierda con ese tipo de programación, prefiero quedarme en la vieja construcción.

 
Alexey Navoykov:
Ya veo, me disculpo entonces, no me di cuenta enseguida. Me sorprende, por supuesto, cómo se las arreglaron para cambiarlo tranquilamente y no se lo dijeron a nadie. Lo que no entiendo es por qué el compilador no reacciona ante la ejecución de una operación no válida. Es decir, el error está presente en cualquier caso.
¿Por qué crees que no es válido? Por favor, utilícelo a su propia discreción. El problema es que cuando una variable estática es inicializada por una función, la inicialización se "pausa" y la función se ejecuta. Y en el ejemplo anterior, todavía hay una variable estática en esa función que no ha sido inicializada todavía. Por lo tanto, una variable inicializada por una función toma un valor diferente.
 
Alexey Navoykov:

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

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. En definitiva, todo el código MQL es una mina que trabaja a cámara lenta.

Bueno... no hay ninguna discrepancia con la descripción de la documentación en este ejemplo... Fíjese bien en la cita de la documentación

Una variable estática puede ser inicializada con una constante o una expresión similar a la constante apropiada para su tipo , a diferencia de una simple variable local que puede ser inicializada con cualquier expresión.


o mediante una expresiónconstante

int a= 1;
int b= a+1;

Esta inicialización es posible. Porque la variable 'a' es inicializada por una constante y la variable 'b' es inicializada por una expresión constante.

 
A100:

Entonces hay que prohibir las instancias estáticas de las clases, porque se inicializan mediante la función del constructor

Preste atención a

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

Bichos, errores, preguntas

Alexey Viktorov, 2017.10.18 09:19

¿Por qué cree que ha cambiado, por qué es inaceptable? Por favor, utilícelo a su propia discreción. El problema es que cuando una variable estática es inicializada por una función, la inicialización se "pausa" y esa función se ejecuta. Y en el ejemplo anterior, todavía hay una variable estática en esa función que no ha sido inicializada todavía. Por lo tanto, una variable inicializada por una función toma un valor diferente.
Lamentablemente, no sé si es posible declarar e inicializar variables estáticas en el constructor, pero espero que me lo cuentes. Y, según tengo entendido, la secuencia de inicialización es muy importante.
Razón de la queja: