Errores, fallos, preguntas - página 1440

 

MT 4. Generador de números aleatorios MathRand() dentro de OnTick(). Al probar el búho, se obtienen resultados diferentes cuando se vuelve a ejecutar con la misma configuración. Esto es natural si el número generado afecta al algoritmo.

Al optimizar, obtengo por alguna razón resultados idénticos en una segunda ejecución con la misma configuración. ¿Entonces MathRand() no funciona en modo de optimización?

 
Сергей Таболин:

En segundo lugar (temo equivocarme aquí, espero queAlexander Puzanov me corrija si es que hay algo), si el programador por alguna razón decide añadir un elemento con índice 20 a un array dinámico, no pasará nada malo. El array tomará esta dimensión y escribirá un valor allí e inicializará los índices "perdidos" con valores cero.

Exactamente. ¿Por qué "cero"? ¿Tal vez debería ser EMPTY_VALUE? ¿O WRONG_VALUE ?

El problema de estas asignaciones implícitas es precisamente su naturaleza implícita: el compilador introduce un código, que un programador piensa de una manera, mientras que otro podría pensar de otra.

Además, es ineficaz: no siempre es necesario inicializar una variable inmediatamente, e inicializar un array grande, en un bucle, puede reducir significativamente la velocidad.

Y en tercer lugar, ¡nadie impide que el programador controle la dimensionalidad y el índice utilizado! La única diferencia es que ahora está obligado a hacerlo. )))

Si el compilador lleva la cuenta de la dimensión de un array por sí mismo, ninguna clase podrá limpiar este código. Es muy posible que la eficiencia disminuya.

Al mismo tiempo, si el compilador no se encarga de esta tarea, el programador puede escribir una clase que se encargue de ello y utilizar un array que se pueda expandir e inicializar con ceros cuando sea necesario.

En el segundo caso, la flexibilidad es mayor.

Así que lo que propones también es una buena solución para muchos casos. Pero puede disminuir la eficiencia, lo que no es bueno.

 
Сергей Таболин:

Este es, en principio, un ejemplo sencillo de cómo debería llenarse normalmente un array dinámico. ¡Hace mucho que no escribo en C, no lo recuerdo, pero así es como se llenan los arrays en php! Todo es lógico y comprensible. Si añado un elemento a un array (arr[] = x), el array se expande automáticamente y el elemento se añade al final del array. Y no tenemos que estirarlo por nosotros mismos, y no tenemos que especificar el índice del elemento por nosotros mismos. Pero aquí tenemos que hacer movimientos absolutamente innecesarios:

la diferencia es evidente...

En mi opinión, es extraño, por decir lo menos ))))

Los lenguajes de programación se dividen en estrictamente tipados y no tipados. Su PHP, R y otros lenguajes funcionales pertenecen a los no estrictamente tipados. En lenguajes estrictamente tipados como MQL o C# y Java no se permite este tipo de manipulación de datos ambiguos. Y esto se hace específicamente para la seguridad del propio programador. La tipificación estricta implica que cada uno de tus procedimientos es extremadamente específico: "tomar un elemento en el índice 0 del array" es un procedimiento específico y claro, pero propones sustituirlo por "tomar algo del array y añadirlo a lo que el compilador decida devolver primero". - Estás de acuerdo en que no llegarás muy lejos con esto.

Por otro lado, por supuesto, queremos construcciones sencillas de alto nivel sin el fastidioso dimensionamiento de los arrays y la constante reorganización por parte del usuario. Para eso está la biblioteca estándar. En lugar de utilizar arrays básicos, cambia a las clases del grupo Array. Así es como, por ejemplo, se ve la adición de cero a 16 en la matriz CArrayInt:

#include <Arrays\ArrayInt.mqh>

void OnStart()
{
   CArrayInt array;
   for(int i = 0; i < 16; i++)
      array.Add(i);   
}

Como puede ver, no hay nada demasiado natural. Y no hace falta devanarse los sesos con el tamaño de la matriz actual y otros reajustes. Todo se hace por usted, dentro de una estricta mecanografía, y se le invita a concentrarse directamente en la tarea del usuario. Este es el poder y el sentido de la OOP.

 

La grabación completa no está disponible. Error de compilación

template<typename T>
class A { protected:
        A( T t ) : t( t ) {}
        T t;
};
class B : A<int> {
        B() : A<int>( 1 ) {} //'<' - member(s) initialization expected
};
 

No encuentro dónde me equivoco.

La tarea consiste en encontrar el valor máximo y mínimo en un intervalo

void OnStart()

  {
int            Kol_Kan=10;       //Количество элементов для копирования
double         HI[];             //массив для хранения максимумов на интервале
double         LO[];             //массив для хранения минимумов на интервале

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумов
CopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумов

ArrayResize(HI,Kol_Kan);         //устанавливаем размер массива
ArrayResize(LO,Kol_Kan);

int in_max=0;                    //индекс максимального значения в массиве
int in_min=0;

in_max=ArrayMaximum(HI,WHOLE_ARRAY,0); //Находим индексы максимума и мин в массивах
in_min=ArrayMinimum(LO,WHOLE_ARRAY,0);

double hi_max;                   // максимальное значение цены 
double lo_min;                   // минимальное значение цены

hi_max=HI[in_max];               //Переносим значения максимумов и мин в переменные
lo_min=LO[in_min];
Alert(hi_max,"___",lo_min);   

  } 
 

Orden incorrecto de los argumentos en ArrayMaximum(), ArrayMinimum().

 
PabloEs:

No encuentro dónde me equivoco.

La tarea consiste en encontrar el valor máximo y mínimo en un intervalo

Funciones

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//copiar valores de máximos

CopyLow(_Symbol,0,2,Kol_Kan,LO); //copiar valores de mínimos

ya redimensiona el array.

Esto es innecesario

ArrayResize(HI,Kol_Kan); //poner el tamaño del array

ArrayResize(LO,Kol_Kan);

 
Sergei Vladimirov:

Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().

Exactamente)) Y aquí estaba pensando...

Vladimir Pastushak:

Funciones

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//copiar valores de máximos

CopyLow(_Symbol,0,2,Kol_Kan,LO); //copiar valores de mínimos

ya redimensiona el array.

Esto es innecesario

ArrayResize(HI,Kol_Kan); //poner el tamaño del array

ArrayResize(LO,Kol_Kan);

Lo sabré, gracias.

 
PabloEs:
Entonces, ¿qué pasa? ¿No puedo resolverlo yo mismo?
 

El autor, en cambio, ya se ha dado cuenta. ))

PabloEs:

Exactamente)) Y aquí estaba pensando...