Biblioteca de clases genéricas - errores, descripción, preguntas, características de uso y sugerencias - página 29
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
MSDN lo llama ring buffer, no se me ocurrió el nombre.
enlace a la
...y terminando con una conversión a argumentos por referencia, no sólo por valor.
puede haber un problema con los literales
enlace en el estudio
Puede haber un problema con los literales
Me da pereza volver a buscar ese artículo, pero lo he estirado un poco. Una lista enlazada simple o doble se basa en una lista enlazada, pero el último elemento almacena un enlace con el primero.
puede haber problemas con los literales
Una lista enlazada simple o doble se basa en una lista enlazada, pero el último elemento de la lista enlazada almacena un enlace con el primer elemento.
Lo más probable es que quien haya portado estas clases haya decidido simplificarse la vida simplificando el código. En lugar de dos punteros m_first y m_last hizo un solo puntero m_head...
La clase LinkedList está correctamente portado, sólo hay una cabeza de puntero, que es tanto el inicio como el final. Así que la implementación interna es efectivamente un bucle, pero el comportamiento externo no lo es. MQ tiene un error en la clase CLinkedNode (métodos Next y Previous). Aquí está el aspecto de su implementación original:
Y así es como se traslada a MQL:
Tal vez no estuvieron atentos y se equivocaron.
Pero en general también me sorprende un poco la implementación de dotnet. Por qué no era posible hacer dos punteros en la propia lista (el primero y el último) en lugar de una cabeza. Eso evitaría comprobaciones extra en los métodos anteriores de la lista de nodos, es decir, se verían exactamente igual que MQ ahora, pero todo funcionaría correctamente. Por supuesto, ralentizaría un poco el proceso de inserción/borrado de nodos, pero aceleraría la iteración sobre ellos, que es una prioridad mucho mayor. Siguiente y Anterior son definitivamente llamados más a menudo, que los nodos añadidos. Así es como lo hice, pensé que sería lo mismo para melkomsoft. Pero no importa )
Por cierto, MQ tiene otro error en la implementación de CLinkedListNode y CRedBlackTreeNode. (excepto m_value) están pensados para ser cambiados únicamente por la propia clase de lista. Nadie más tiene que cambiarlos. Por eso son campos internos en dotnet. MQ ha creado métodos públicos para modificar estos campos, y al menos les habrían dado un nombre específico... pero no, sólo los nombres habituales:
Hola a todos.
¿Hay alguna otra forma de eliminar elementos en CHashMap que no sea copiarlos mediante CopyTo y eliminarlos manualmente?
Aquí hay un par de cosas más para hundir el horno de la pobre implementación de la biblioteca. Su clase CKeyValuePair hereda la interfaz IComparable (y por lo tanto IEqualityComparable también) por alguna razón, requiriendo que el tipo de usuario Key deba soportar estas interfaces también. Aunque no hay necesidad en ello si definimos nuestro propio Comparer. En el original KeyValuePair no tiene ninguna interfaz, por supuesto.
Si sigues hurgando, encontrarás cosas aún más extrañas:
Es decir, si pasas accidentalmente un puntero roto al constructor, el programa no sólo seguirá funcionando tranquilamente, sino que su lógica también cambiará.
El constructor debería tener este aspecto:
Y noPOINTER_INVALID . Y hay una firma de constructor diferente para el comparador por defecto.
¿Puedes decirme por qué el código no compila?
El problema está en los enums del sistema: ENUM_CHART_PROPERTY_DOUBLE, ENUM_CHART_PROPERTY_STRING algo está mal en ellos. Si utilizo mi propio enum como tipo de clave, la compilación también funciona.