Características del lenguaje mql5, sutilezas y técnicas - página 211

 
fxsaber #:

Usted mismo informó del cuarto error. ¿Por qué ZeroMemory es peor que {}? Es decir, tenemos algún mecanismo no autorizado de acceso a lo privado que no es detectado por el compilador por alguna razón.

¿Crees que los desarrolladores no lo arreglarán? En un tiempo el compilador tampocoreaccionaba aZeroMemory

 
A100 #:

Usted mismo informó del cuarto error. ¿Por qué ZeroMemory es peor que {}? Es decir, tenemos algún mecanismo no autorizado de acceso a lo privado que el compilador no puede detectar por alguna razón.

No creo que sea un error. La estructura no tiene un constructor pero se está inicializando. FileReadStruct - eso es algo realmente aterrador...

 
fxsaber #:

No lo veo como un error. La estructura no tiene constructor, se inicializa. FileReadStruct es entonces una cosa que da miedo.

uint  FileReadStruct( 
   int          file_handle,        // handle файла 
   const void&  struct_object,      // структура, куда происходит считывание 
   int          size=-1             // размер структуры в байтах 
   );

A juzgar por la descripción - es una especie de auto-engaño

 
A100 #:

Por la descripción , parece una especie de autoengaño.

Bueno, sí - es todo un engaño.

 
A100 #:

A juzgar por la descripción, esto es una especie de auto-derrota

La referencia a la documentación sin tener en cuenta los artefactos de copiar y pegar - extraño.

 
fxsaber #:

Enlaces a la documentación sin tener en cuenta los artefactos de copiar y pegar - extraño.

Veo esta función por primera vez en absoluto - podrían haberme informado de que hay un error en la descripción

Hay un error estructural además de la descripción:

struct X {
    X( int i ) : i( i ) {}
    const int i;
};
void OnStart()
{
    X x( 5 );
    FileReadStruct( 0, x, -1 ); //(1) нормально ???
    ZeroMemory( x );            //(2) Error: 'x' - not allowed for objects with protected members or inheritance
}

¿Por qué ZeroMemory es peor que FileReadStruct?

¿Otra esperanza de que los desarrolladores no lo noten, lo pospongan o sean demasiado perezosos para arreglarlo (subraya el punto)?

Mi argumento es sencillo: en su día ZeroMemory compiló con todo esto (incluido el privado ), pero se dieron cuenta, se pusieron las pilas y lo arreglaron.

 
A100 #:

Es la primera vez que veo esta función, podrían haberme dicho que había un error en la descripción.

Nunca he mirado la descripción de esta función. Todo está claro desde el nombre.

Además de la descripción también hay un error estructural:

No hay ningún error en el siguiente código.

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {};

  uchar Bytes[];
  
  StructToCharArray(Ticks[0], Bytes);
  CharArrayToStruct(Ticks[1], Bytes);

  FileReadStruct(0, Ticks[0]);
  FileWriteStruct(0, Ticks[1]);
  
  FileWriteArray(0, Ticks);
  FileReadArray(0, Ticks);
}

El aburrimiento no ganará a la comodidad.


¿Por qué ZeroMemory es peor que FileReadStruct?

Le gusta remitirse a la documentación. Ahí dice todo sobre las limitaciones de ZeroMemory. Pero no dice nada sobre las limitaciones de File*. En cuanto a ZeroMemory, juzgo por lo que tengo. Ahora no es conveniente, pero parece que se ha hecho a propósito.

Pero si se comparan estas dos funciones, FileReadStruct sólo funciona con estructuras simples. Esta es una diferencia fundamental.


Este tema trata de las peculiaridades de MQL5. He señalado uno (no funciona en MQL4). Este diálogo es, por desgracia, una pérdida de tiempo

 
fxsaber #:

No hay errores en el siguiente código.

Le gusta remitirse a la documentación. Ahí se dice todo sobre las limitaciones de ZeroMemory. Pero no dice nada sobre las limitaciones de File*. En cuanto a ZeroMemory, confío en lo que tengo. Ahora no es conveniente, pero parece que se ha hecho a propósito.

Si se comparan estas dos funciones, FileReadStruct sólo funciona con estructuras simples. Se trata de una diferencia de principio fundamental.

Hay un error (el compilador simplemente no nos informa de ello por el momento) y es el siguiente: alguna función (concretamente, FileReadStruct) externa a la clase obtiene acceso directo a los miembros protegidos de esta clase, lo que contradice el propio concepto de privado, protegido.

¿Y cómo es que esta función es mejor queZeroMemory y otros cientos de funciones? ¡Nada! - Los desarrolladores aún no se han puesto manos a la obra. Antes,ZeroMemory tampoco tenía limitaciones especificadas en la documentación.Pero ahora está ahí - y no porque le cause algunos inconvenientes - sino porque un solo principio funciona - ya seaFileReadStruct oZeroMemory, o cientos de otras funciones similares - todas son iguales.

 
A100 #:

que otras cien funciones similares son todas iguales

FileLoad/FileSave a la caja de desigualdades.

La conveniencia no ganará.

No hay razón para dispararse en el pie.

 
fxsaber #:

FileLoad/FileSave más a la caja de desigualdades.

No hay razón para dispararse en el pie.

Es usted quien se dispara en el pie, al declararse privado. Usted ha limitado el acceso a sí mismo y luego se preguntará por qué el código donde se requiere el acceso público para las funciones externas ha dejado de funcionar de repente