Errores, fallos, preguntas - página 1356

 
Vasiliy Sokolov:
Muy chulo y, sobre todo, ideológicamente correcto. ¡Dos manos a favor!
Entonces sería ideológicamente correcto
class A { public:
        bool operator !=( A* ) {}
        bool operator  <( A* ) {}
};
void f()
{
    A *a1, *a2;
    a1 != a2; //здесь простое сравнение указателей вместо вызова operator !=()
    a1 <  a2; //здесь вызывается operator <()
}
se llamaría al operador!=() en lugar de comparar los punteros a la igualdad como se hace ahora. Y la comparación de punteros podría realizarse mediante una función especial similar a ::GetPointer(...)

Pero esto no se hace por la sencilla razón de que traería importantes inconvenientes, y la ventaja sólo sería la corrección ideológica

 
Hace tiempo que no recibo una actualización: MetaTrader5 build 1159 (conectado a MetaQuotes-Demo). El compilador de comandos carga la compilación 1162
 
Vasiliy Sokolov:

Entonces la cadena es también un conjunto de números específicos. Y una imagen también es un número y un impulso eléctrico en un chip...

En general, estudia ingeniería eléctrica, colega.

Aquí hay una comparación de los punteros en C++ y los descriptores en MQL/C# y algunos otros lenguajes.

El reto: quieres chatear en directo con un compañero.

1. Punteros. Conocemos la calle, el número de la casa y el piso. Vamos a la dirección, despertamos al amigo, conseguimos una burbuja, está emocionado y charlando )).

2. Descriptores. No sabemos la dirección exacta, nadie puede entrar en la casa, por ejemplo, es el edificio del FSB. Hay un punto de control en la casa, que se niega a decir la dirección por el nombre de un amigo (por descriptor), se niega a dejar en la casa (en el espacio de la dirección). Seguridad llama al compañero y le pide que salga. Él sale, tú sacas alegremente la burbuja, él sisea, -¡¡qué eres!!!! guárdala inmediatamente!!! Tanto para caminar... Volviendo a casa con una botella sin abrir en la mano, te das cuenta de que los descriptores proporcionan seguridad a cambio de capacidad de señalización.

 
Vasiliy Sokolov:

En general, estudia ingeniería eléctrica, colega.

¿No hay otros argumentos?
 
A100:
¿No hay otros argumentos?
¿Y tú?
 
A100:
Tengo fragmentos de código en los que los punteros se convierten explícitamente en números (para la interconexión con sistemas de escritura/lectura externos, y para el análisis de errores y la depuración), si esto se prohíbe entonces la flexibilidad se verá reducida y tendré que rehacer.
Interesante argumento, se necesita algo de tiempo para pensarlo. Por favor, cree una solicitud, lo discutiremos en detalle.
 

Por cierto, qué tal si se introducen los operadores * y & en MQL para permitir el acceso explícito a un objeto en el primer caso, y tomar un puntero de objeto en el segundo (en lugar del engorroso GetPointer). El asterisco es imprescindible, y no hay nada en el lenguaje que lo sustituya.Sin ella, es imposible controlar situaciones como la descrita por A100 más arriba, cuando en lugar de los propios objetos se realizan acciones de puntero. Personalmente, esto es un problema constante, tengo que estar constantemente en alerta o especificar A.operator=(B), A.operator!=(B) en todas partes, es decir, se pierde la brevedad, y la sobrecarga de operadores en realidad carece de sentido.

Ya planteé este problema una vez, pero el tema se estancó. Terminemos de una vez este asunto.

 

Pregunta sobre las variables externas.

Me he encontrado con una situación en la que la variable externa cambia durante la ejecución del programa, pero cuando se cambia el plazo, vuelve a tomar el valor establecido en la ventana de propiedades. Por ejemplo, si antes del inicio establezco TradeEnable en EnableAll y cambio el valor a EnableBuy durante la ejecución del programa, entonces cuando el gráfico cambie a otro marco temporal el valor volverá a EnableAll. El valor que defino en el evento del temporizador y la salida a través de Comment, no puede haber ningún error.

enum ETradeEnable {EnableAll, EnableBuy, EnableSell, DisableAll};
extern ETradeEnable TradeEnable = EnableAll;

La variable TradeEnable no se ve afectada por el giro de los gráficos. Lea el manual - A diferencia de las variables de entrada, los valores de las variables externas pueden modificarse mediante programación mientras el programa se está ejecutando.

Así es como se configuran OnDeinit y OnInit.

Pregunta: No entiendo algo o el cambio de TradeEnable es un error de ejecución?

int LastDeinitReason = 0;

void OnDeinit(const int reason)
{
    LastDeinitReason = reason;
    if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS)
        return;
    EventKillTimer();
// далее код при завершении работы советника
}

int OnInit()
{
    if(LastDeinitReason==REASON_CHARTCHANGE || LastDeinitReason==REASON_TEMPLATE)
    {
        LastDeinitReason = 0;
        return(INIT_SUCCEEDED);
    }
    if(LastDeinitReason==REASON_PARAMETERS)
    {
        SetParams();
        return(INIT_SUCCEEDED);                              
    }
// далее код инициализации при запуске
}
 
Alexey Navoykov:

Terminemos este tema de una vez.

Allí se sacrifican dos operadores (== y !=) para conservar todos los demás.

Veo una salida en un patrón.

template<typename T1, typename T2>
bool IsEqualPointer( const T1 *t1, const T2 *t2 )
{
    return ( ulong(t1) == ulong(t2) );
}

Si se define operator==(!=), se llamará. Si no se define, los punteros se compararán con la igualdad. Y si se define el operador==(!=) y es necesario comparar los punteros en igualdad, esto se puede hacer a través de la plantilla especificada.

Los cambios en el sistema existente son mínimos y lo principal es que no afectarán a quienes simplemente comparan punteros a la igualdad sin sobrecarga del operador==(!=).

 
A100:

Allí se sacrifican dos operadores (== y !=) para conservar todos los demás.

Veo una salida en un patrón.

Si se define operator==(!=), se llamará. Si no se define, los punteros se compararán con la igualdad. Y si se define el operador==(!=) y es necesario comparar los punteros en igualdad, esto se puede hacer a través de la plantilla especificada.

Los cambios en el sistema actual son mínimos y lo principal es que no afectarán a quienes simplemente comparen punteros sin sobrecarga de operator==(!=).

Por supuesto, puedes hacer la comparación y la asignación a través de funciones separadas, pero ¿qué sentido tiene? La cuestión es convencer a los desarrolladores para que hagan una solución adecuada.