Errores, fallos, preguntas - página 2890

 
Roman:

Si necesitas coger un error de este valor, pues inicialízalo con 333 ))
Es sólo un valor inicial.

Así es, es un error. Así que, o damos un aviso al asignar variables no inicializadas en todos los casos, o no lo hacemos, y lo inicializamos con un cero por defecto, por ejemplo, dentro del lenguaje en todos los mismos casos.

 
Valeriy Yastremskiy:

Así es, es un error. Resulta que o bien damos un aviso para asignar variables no iniciadas en todos los casos, o bien no lo damos, sino que lo iniciamos con el cero por defecto por ejemplo, dentro del lenguaje en todos los mismos casos.

¿Sólo en qué parte de los ejemplos anteriores has visto esos casos?

 
A100:

¿Sólo en qué parte de los ejemplos anteriores has visto esos casos?

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

Bichos, errores, preguntas

A100, 2020.10.27 16:11

Tienes que inicializarlo, pero sólo con un valor significativo. En el ejemplo anterior no existe ese valor, por lo que la práctica no es mala, la única posible. De lo contrario, habría una doble inicialización

int f( int i ) { /*вычисления*/ }
void g( int k )
{
        for ( int i = 0, j; i < k; i = j )
        {
                j = f( i );
                /*вычисления*/
        }
}

 
Roman:

¿Y dónde estála asignación de variables no inicializadas? ¿Qué variable no está inicializada? y ¿a quién se le está asignando? Lo que has resaltado: j de = a la izquierda j=, no a la derecha =j, es decir, no se asigna a nadie antes de que se le asigne a él mismo un valor

 
A100:

¿Sólo en qué parte de los ejemplos anteriores has visto esos casos?

Sí, se me olvidó, en todos los casos la variable no inicializada tiene una asignación, no al revés. Tal vez el compilador va de arriba hacia abajo de una manera línea por línea, en cuyo caso sí, la asignación es en la parte inferior y viceversa en la parte superior. También hay una advertencia sobre la posible asignación a una variable no inicializada.

 
A100:

¿Y dónde estála asignación de variables no inicializadas? ¿Qué variable no está inicializada? ¿Y a quién se le está asignando? Lo que has resaltado es j=, no =j

La asignación a una variable no inicializada, en el cuerpo del bucle. Antes de la primera iteración j no está inicializado todavía.
Se inicializará después de pasar la primera iteración.
Primero se ejecuta el cuerpo del bucle y luego el ámbito incremental. Que has sustituido por i = j

 
Roman:

Asignación a una variable no inicializada, en el cuerpo de la función. Antes de la primera iteración j aún no está inicializado.
Se inicializará después de la primera iteración.
Primero se ejecuta el cuerpo de la función y luego el área de incremento. Que ha sustituido por i = j

No, es cierto, al no inferir j en la primera iteración se inicia sólo j=f(i) y en la segunda sólo será i=j creo que el compilador está parseando de arriba a abajo y da avisos.

 
Valeriy Yastremskiy:

No, así es, la variable j no se inicializa en la primera iteración sólo j=f(i) y en la segunda iteración sólo i=j creo que el compilador analiza de arriba a abajo y da avisos.

Sí, pero antes de la primera iteración la variable j aún no está inicializada, esto es lo que jura el compilador.

 
Valeriy Yastremskiy:

Sí, eso estaba mal, en todos los casos de variable no inicializada hay una asignación, no al revés. Tal vez el compilador va de arriba hacia abajo, así que sí, la asignación está en la parte inferior y viceversa en la parte superior. También hay una advertencia sobre la posible asignación a una variable no inicializada.

Esto puede ocurrir cuando el compilador no tiene información objetiva:

void f( int& i ) { /*вычисления*/ }
void OnStart()
{
        int i;
        f( i );
        int j = i; //нормально ??? а если i не инициализирована?
        printf("%d",j);
}

Es decir, tal vez f() estaba inicializando i y tal vez no. Y aquí el compilador de C++ da una advertencia, mientras que el de MQL de alguna manera no lo hace.

 
A100:

Esto puede ocurrir cuando el compilador no tiene objetivamente ninguna información:

Es decir, tal vez f() tenía i inicialización, tal vez no. Y aquí el compilador C++ da una advertencia, MQL no.

Creo que un compilador más simple. Analiza la sintaxis del diseño de arriba a abajo en busca de errores de sintaxis obvios, que no respeten los tipos y que utilicen variables erróneas. Cuando en el segundo ejemplo se puso la inicialización, no generó ninguna advertencia. Aunque la ejecución del programa es idéntica.