Errores, fallos, preguntas - página 2564

 
Igor Makanu:

?

es una situación extraña, todo fuera de la clase ha estado trabajando durante mucho tiempo con los staichiqs. y sólo estoy haciendo un gran alboroto sobre él.... Sólo por diversión, reproduzca el código usted mismo:

¿Ves una instancia del objeto? y existe en MQL ;)

SZZ: Y existe a nivel de ayuda... ¿cuál es tu problema conmigo?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

pr


imp

 
Andrey Barinov:

Todas las mismas reglas se aplican a las estáticas (privadas, protegidas, públicas), sólo que no requieren la creación de objetos.

No en general: por ejemplo, no se puede restringir un statik público en una clase derivada

 
Andrey Barinov:



hmmm... Cómo explicar lo absurdo de la situación... Te sugerí que leyeras los posts de los administradores (desarrolladores), te mostré la ayuda que escribieron, ¿qué quieres de mí con tus fotos?

No creo que por qué es así, he leído el foro y la ayuda, y hacer lo recomendado por los desarrolladores. Si crees que es necesario, escribe al "comité de protección de las normas C++", a la ONU... ¡Bueno, al menos el administrador en el PM, si no se puede, pero luego bloquear el mensaje de los desarrolladores y salirse con la suya!

ZS: De alguna manera me las arreglé para insertar el código fuente y no las imágenes, ¿por qué no lo hiciste?

int print(int value)
{  Print(value,":",__FUNCTION__); 
 return(value);
}
class A
{
private:
   static int        a1;
   static void       inc_a1(){a1++; Print("a1 = ", a1);}
protected:
   static int        a2;
public:
   static int        a3;

};
//+------------------------------------------------------------------+
static int A::a1 = print(1);
static int A::a2 = print(2);
static int A::a3 = print(3);

//+------------------------------------------------------------------+
void OnStart()
{

A::inc_a1();
A::inc_a1();
A::inc_a1();

}

2019.09.17 22:11:49.534 tst (EURUSD,H1) 1:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) 2:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) 3:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 2

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 3

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 4

ZS: la situación es bastante cómica, quería ayudar, ahora estoy haciendo excusas.... ¿Por qué? - bueno, golpea la barandilla para la verdad... pisa el rastrillo....
 
Igor Makanu:

El único error en el código está en el acceso al método privado. Este error ha aparecido recientemente.

 

La función ChartOpen siempre devuelve 0 en el servicio. Aunque el propio gráfico se abre.

#property service

//int OnInit()
void OnStart()
  {
   long Otvet= ChartOpen(Symbol(),PERIOD_D1);
   Print("Otvet=",Otvet);

  // return(INIT_SUCCEEDED);
  }
 
fxsaber:

El único error en el código está en el acceso al método privado. Este fallo ha aparecido recientemente.

Pensé que había olvidado algo, así que volví a leer cómo se comporta la estática en C#https://metanit.com/sharp/tutorial/3.6.php

Los miembros estáticos de la clase son comunes para todos los objetos de la clase, por lo que debe referirse a ellos por su nombre de clase:

Tenga en cuenta que los métodos estáticos sólo pueden referirse a miembros estáticos de la clase. No podemos dirigir métodos no estáticos, campos, propiedades dentro de un método estático.


En MQL, la estática se inicializa antes de ejecutar OnInit() , ahora vamos a discutir la visibilidad global de los métodos privados para la estática.... este comportamiento de la estática en MQL - si se usa la estática, significa que no usamos las características de protección de datos de una clase, imho

¿cómo de grande es el bicho? - la forma en que los desarrolladores lo harán, dije que el comportamiento en las operaciones de contexto está determinado por el programador (¡el operador de resolución de contexto es el operador con mayor prioridad en el lenguaje! ), y el compilador ayudará correctamente - bueno, como sucede)))

¿funciona así?

class A
  {
private:
   static void              My_function()
     {
      Print("^_^");
     }
  };
  
A a;
void OnStart()
  {
   A::My_function();
   a.My_function();  // 'A::My_function' - cannot access private member function        
  }

en general, hace el trabajo


PD: actualizado a 2145 - el código con la estática se comporta igual, si se mantiene así durante medio año, resultará que este es el comportamiento previsto de la estática ;)

UPD: recuerde, como se llama en el argot a todo esto, ¡trucos sucios! ))) - Busque muchos ejemplos en la web, donde este comportamiento es aceptado como un estándar del lenguaje, y donde está ligado a un compilador específico del fabricante. En Python, ¿no es eval() lo que rompe la ejecución lineal del código? - Bueno, algunos lo hacen y otros no porque el comportamiento es imprevisible.


UPD: revisa en 2145 mi pregunta de hace un meshttps://www.mql5.com/ru/forum/320733#comment_12989063

https://www.mql5.com/ru/forum/320733#comment_12958594

void OnStart()
  {
   double x=100.0;
   f(x);
  }
//_______________________________________________________________________
void f(bool v)
  {
  }
//_______________________________________________________________________

nada ha cambiado, en bool al comprobar los tipos el compilador no ha aprendido a escribir advertencias - esto es muy desagradable, estaba buscando un error en mi código, aunque estaba seguro de que el compilador MQL siempre comprueba la coincidencia de tipos

 
Igor Makanu:

¿Qué tanto es un error? - Sea cual sea el giro de los desarrolladores, así será.

Es obvio que el fallo se arreglará.

Nada ha cambiado, el compilador no ha aprendido a escribir advertencias sobre bool cuando comprueba los tipos

La conversión automática de punteros y tipos numéricos a bool es muy conveniente.

 
Igor Makanu:

nada ha cambiado, en bool cuando se comprueban los tipos el compilador no ha aprendido a escribir advertencias - esto es muy desagradable, ya estaba buscando un error en mi código, aunque estaba seguro de que el compilador MQL siempre controla estrictamente la coincidencia de tipos

No hay pérdida de datos durante esta fundición. O bien 0 o bien no 0.

Otro caso es cuando double -> cualquier tipo de entero (hasta int32 inclusive)

 
Slava:

Con esta fundición, no hay pérdida de datos. O bien 0 o bien no 0.

Otra cosa es cuando se hace un casting de double -> cualquier tipo de entero (hasta int32 incluido)

¿pero al revés?

Estaba buscando un error en mi código

Al principio escribí una prueba, pero usé primero int , luego renuncié a usar bool, pero no arreglé todo el código, no lo recuerdo, pero era así:

void OnStart()
{  int x=100.0;
   f(x); }
//_______________________________________________________________________
void f(int  v)  //так тестил
{
   if(v>0) v++;

}

//_______________________________________________________________________
void f(bool  v)  // потом решил, что мне нужен флаг, а ниже забыл исправить код
{
   if(v>0) v++;

}
//_______________________________________________________________________


Estoy un poco preparado para tal comportamiento ahora, pero por qué estoy escribiendo sobre ello... bueno, en la comprobación de las condiciones MQL en if() - ¿controlan estrictamente los tipos? cualquier uso de operaciones no booleanas emitirá una advertencia? - Bueno, de la misma manera que escribí en C# en VS2017 - mi código de ejemplo no compila y MQL no lanza una advertencia. En mi opinión, para aquellos que son nuevos en la programación en MQL, este comportamiento implica algunas sorpresas.

 
fxsaber:

Es obvio que el fallo se solucionará.

No voy a discutir, pero mi opinión es que no se debe confiar en el control del compilador cuando se sale de la clase a través de la estática, así como el uso de operador de resolución de contexto,

es decir, si escribe un método/campo estático o utiliza ::: - no confíe en el compilador