Mi enfoque. El núcleo es el motor. - página 99

 
Реter Konow:
En resumen, cada vez que cambie el valor de un parámetro de usuario, este valor debe convertirse en un valor variable de la unión y guardarse inmediatamente en una matriz de bytes compartida, que luego se puede convertir en uint y escribir en el recurso.

Debe tener un parámetro de usuario dentro de la estructura de la unión. Al cambiar el parámetro, la estructura cambiará con un cambio simultáneo de la matriz int

union c
{
  uint i[2];
  long width;
}cc;
 
cс.width = 200;

i[2] es un recurso de usuario que es leído por otro programa.

Con una línea cc.width = 200 cambiará:

  1. El parámetro responsable de la anchura,
  2. La estructura que contiene este parámetro,
  3. El array del recurso que está leyendo el otro programa.

Y aquí no hay conversión ni copia, sólo mapeo.
 
Vasiliy Sokolov:


Puedo cambiar las funciones de envoltura en el archivo de propiedades de la conexión y convertir cada valor utilizable en la variable correspondiente de la unión, y hacer una matriz de bytes sobre la marcha. Sin embargo, los valores de texto, que también deben ser pasados, deben ser convertidos a una matriz de bytes utilizandoStringToChar().

Sin embargo, esto elimina el sentido de utilizar una unión. Después de todo, si tengo que usarStringToChar() de todos modos, ¿por qué no ensamblar todo en una cadena y luego traducir toda la cadena a bytes usandoStringToChar()?

 
Vasiliy Sokolov:

Debe tener un parámetro de usuario dentro de la estructura de la unión. Al cambiar el parámetro, la estructura cambiará con un cambio simultáneo de la matriz int

i[2] es un recurso de usuario que es leído por otro programa.

Con una línea cc.width = 200 cambiará:

  1. El parámetro responsable de la anchura,
  2. La estructura que contiene este parámetro,
  3. El array del recurso que es leído por un programa de terceros.

Y aquí no hay conversión ni copia, sólo mapeo.

Vasily, te olvidas de que estamos hablando de una comunicación bidireccional. En mi motor, puedo vincular todo a los sindicatos, pero no puedo ser responsable del código del usuario. Sólo se me ocurren envoltorios y los pongo en los plugins.

¿Dónde está la garantía de que el usuario también utilizará los sindicatos? Así que cuando llama a mis funciones de envoltura, tengo que tomar su valor a mí mismo y elenco a una de mis variables de mis uniones dentro de su archivo de plugin.

 
Реter Konow:

Puedo cambiar las funciones de envoltura en el archivo de propiedades de la conexión y convertir cada valor utilizable en la variable correspondiente de la unión, y hacer una matriz de bytes sobre la marcha. Sin embargo, los valores de texto, que también deben ser pasados, deben ser convertidos a una matriz de bytes utilizandoStringToChar().

Sin embargo, esto elimina el sentido de utilizar una unión. Después de todo, si tengo que usarStringToChar() de todos modos, ¿por qué no ensamblar todo en una cadena y luego traducir toda la cadena a bytes usandoStringToChar()?

Porque tendrás doble análisis. Convertirás todo en una cadena, lo que es muy lento. Luego se analiza la cadena en un array, lo que es muy rápido. Luego lo ensamblas de nuevo a una cadena - eso es muy rápido. Luego se analiza la cadena en los tipos correctos - eso es muy lento.

 
Реter Konow:

De acuerdo, pero ¿qué pasa con los textos?

Hay que convertirlos en bytes medianteStringToChar(). No puedes usar la unión, ¿verdad?

Sí, hay que traducirlos, pero es rápido, a diferencia del análisis sintáctico.

 

Por ejemplo:

Aquí está la función de envoltura en el archivo depropiedades de conexión:

string E_Last_10_bars_2_Close_price(string n = rare_value,  int Property = -1){return(GET_N_SET(11,n,Property));}

Esta función se llama así:

E_Last_10_bars_2_Close_price(Close[2]);

Es decir, el usuario establece el valor deClose[2] en una celda de la tabla.

Close[2] - это значение дабл.

Por lo tanto, dentro de su función envolvente en su programa, puedo representar el valor(Close[2]) como un array de char.

Pero, en la misma celda, el usuario puede enviar el valor "¡Hola! :)", y entonces ¿qué hacer?

E_Last_10_bars_2_Close_price("Привет! :)");
 
 

Oh, Peter, empezaste con el lenguaje de programación equivocado. Deberías haber aprendido algo no estrictamente escrito.

En general, te he entendido, has inventado tu propio lenguaje no tipado basado en MQL. Has sorteado su tipificación estricta utilizando cadenas. ¡Esto es una maniobra!

 
Vasiliy Sokolov:

Oh, Peter, empezaste con el lenguaje de programación equivocado. Deberías haber aprendido algo no estrictamente escrito.

En general, te he entendido, has inventado tu propio lenguaje no tipado basado en MQL. Has sorteado su tipificación estricta utilizando cadenas. ¡Esto es una maniobra!

Sí,)) ¡Un movimiento con un caballo!

 

Si utiliza una tabla, debe decidir si quiere que los datos de la tabla sean estrictamente numéricos o textuales. Si se trata de texto, se pasan cadenas. Si es real, su función debe ser así:

string E_Last_10_bars_2_Close_price(double n,  int Property = -1){return(GET_N_SET(11,n,Property));}