Errores, fallos, preguntas - página 167

 

Pregunta sobre las matrices dinámicas

double open_main_array[] - variable de clase

inicialización

ArraySetAsSeries(open_main_array,true);

La primera llamada de la función que contiene el siguiente código

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

2ª llamada de la función

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

¿El array open_main_array contendrá los datos copiados durante la 2ª llamada o el array se incrementará y contendrá los datos de la 1ª y 2ª llamadas?

Como alternativa, puede utilizar:

ArrayFree(open_main_array)

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

variable no inicializada - significa que se garantiza que la variable tiene una rama de paso cuando no está inicializada. por ejemplo, el valor por defecto se omite explícitamente en switch, en el que MainPrice debe ser explícitamente inicializado (o explícitamente puesto a cero cuando se declara).

Sobre el "pase garantizado". Este es un trozo de código de este tipo:

            (1)         double local_low;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion=false;
            (4)         for(uint n=1;n<Ac-k;n++)
            (5)           {
            (6)            if(low[index_interior-n]<low[index_interior-n-1])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion=true;
            (10)              break;
            (11)              }
            (12)          }  
            (13)        if(interrupcion)
            (14)          {
            (15)           if(EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

En la última línea (línea 15) dice "possible use of uninitialized variable 'local_low'".

Pero debido a la utilización de la interrupción de la variable bool en la línea 9 justo después de inicializar la variable local_low en la línea 8, resulta que en la línea 15 se garantizará la inicialización de la variable local_low. Así que en este punto, la advertencia "posible uso de la variable no inicializada 'local_low'" no significa "garantizado", sino sólo la posible presencia de una rama de paso en la que la variable no está inicializada.

 
Yedelkin:

Sobre el "paso garantizado". Aquí hay un trozo de código:

En la última línea (línea 15) dice "possible use of uninitialized variable 'local_low'".

Pero debido a la utilización de la interrupción de la variable bool en la línea 9 justo después de inicializar la variable local_low en la línea 8, resulta que en la línea 15 se garantizará la inicialización de la variable local_low. Así que en este momento la advertencia "possible use of uninitialized variable 'local_low'" no significa "garantizado", sino sólo la posible presencia de una rama de paso donde la variable no está inicializada.

Así es, te da un aviso.

No confundas tu complacencia con la realidad. La realidad se revela después de muchos proyectos y la comprensión de que "esto no puede ser porque la lógica lleva a tal o cual cosa" ocurre todos los días.

 
Renat:

No confunda su autoestima con la realidad. La realidad se revela después de muchos proyectos y la constatación de que "esto no puede ser porque la lógica lleva a tal o cual cosa" se produce a diario.

¿Puede obtener una explicación adecuada? Se da el código, se afirma la afirmación "farisaica", ¿dónde está el error? No entiendo el esoterismo.

...Si se tiene en cuenta la traducción de la frase"possible use of uninitialized variable", la advertencia se emite, efectivamente, de forma "absolutamente correcta". Pero no se trata de que esté "garantizado", sino de la posible existencia de una rama de un pase en la que la variable esté sin inicializar. Eso es exactamente de lo que estoy hablando "con confianza".

 
Yedelkin:

¿Podemos obtener una explicación adecuada? Se da el código, se afirma la afirmación "farisaica", ¿dónde está el error? No entiendo el esoterismo.

¿Y si en lugar de

interrupcion=true;

en lugar de (por ejemplo)...

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
¿También harías una reclamación? ¿Especialmente si algunaFunciónN consta de cientos de líneas de código?

Según tu trozo de código, sí, la variable se inicializa si se ejecuta la línea 15. Pero, ¿qué le dirías al compilador que hiciera en el ejemplo que he puesto? La tarea es difícil. Y tampoco es necesario resolverlo.

El error se denomina"posible (tal vez) uso de una variable no inicializada" (aunque de todos modos lo sabes).

Será mejor que asignes explícitamente algún valor a la variable local_low. Créeme, puede salvarte de posibles errores en el futuro (se corrige el código, se quita algo, se mueve algo, se cambia algo, y la línea 13 puede caer de este proceso)

 
Yedelkin:

¿Podemos obtener una explicación adecuada? Se da el código, se afirma la afirmación "farisaica", ¿dónde está el error? No entiendo el esoterismo.

En el mundo real, cuando la inmensa mayoría de los programadores de cualquier lenguaje escriben código completamente desprotegido y con fallos, los compiladores deben ser lo más rigurosos posible. La complacencia de los programadores "la lógica es clara, no debería haber problemas, todo está inicializado como debe ser" trajo y sigue trayendo una gran cantidad de errores.

Por ello, las preguntas sobre las críticas a las medidas estrictas son irrelevantes en este caso.

 
Renat:

... La autoconfianza de los programadores "la lógica es clara, no debería haber problemas, todo está inicializado correctamente" ha causado, trae y traerá un gran número de errores.

Por eso las críticas a las medidas estrictas son irrelevantes aquí.

Prescindamos de las críticas. Sobre todo porque no lo he expresado con mis palabras. Y en cuanto a la presencia de críticas por mi parte, estás muy equivocado.

Entonces, ¿cuál es su error? Ya que no puedes poner el esoterismo en un código, por favor, contéstame en el lenguaje de la lógica. Es decir, en un lenguaje que cualquier programador pueda entender.

 
notused:

¿también harías una reclamación ? ¿Especialmente si algunaFunciónN consta de cientos de líneas de código?

Tú también estás en el mismo lugar. Bueno, no tengo ninguna queja. Sólo quiero dejar claro que no todo es tan categórico como dice Renat.

¿Y el código? Te he dado un ejemplo concreto de código que refuta la categorización de la afirmación de Renat utilizando la lógica ordinaria. Gracias por los consejos, intento mejorar siempre.

 
Yedelkin:

Prescindamos de las críticas. Sobre todo porque no lo he expresado con mis palabras. Y en cuanto a la existencia de críticas por mi parte, estás muy equivocado.

Entonces, ¿cuál es su error? Ya que no puedes poner el esoterismo en un código, por favor, contéstame en el lenguaje de la lógica. Es decir, en un lenguaje que cualquier programador pueda entender.

Tienes"posible uso de la variable no inicializada 'local_low'".

¿Y qué obtienes si

(1)         double local_low=1.1; // или что-то другое
 
Yedelkin:

Entonces, ¿qué es un error? Ya que no puede poner el esoterismo en el código, por favor, conteste en el lenguaje de la lógica. Es decir, en un lenguaje que cualquier programador pueda entender.

Vuelva a leer mis respuestas desde el punto de vista de un gerente de una empresa de software que ha sacado al mercado muchos proyectos de software.

De lo contrario, quedándose en el nivel de "cualquier programador", no entenderá cuál es el error.