Preguntas de un "tonto" - página 125

 
MetaDriver:

Oh, ahora lo veo.

Renat, tengo una sugerencia desde hace mucho tiempo, y es exactamente sobre el tema. Por favor, haz una tipificación con nombre para los arrays, al menos para los estáticos (todos los demás tipos ya lo tienen).

Es decir, posibilidad de declarar por ejemplo: typedef Int8 = int[8];.

Se puede hacer fácilmente a través de estructuras. No lo complicaremos en absoluto.

struct Int8 { int arr[8]; };
 
Renat:

Esto se hace fácilmente a través de las estructuras. No lo compliquemos demasiado.

Genial. Fácil. ¡Eso es lo que hacemos! ¿Pero qué necesito? ¿Una cosa simple ?

No crees que tu nav aja Occam y nuestra navaja (de usuario ) Occam son dos navajas muy diferentes. Tú con tu minimalismo, tiendes a crear tal exceso en los usuarios, que Occam debería colgarse en la valla más cercana.

Si te importa tanto la simplicidad, entonces haz que sea posible pasar subarreglos habituales a las funciones. Todo el mundo estará contento, y los minimalistas están contentos.

// Por cierto, funciona bien en F4 - también para las dinámicas. :)

 
Renat:
Estática, por supuesto.
Bueno, ahí lo tienes. Demasiado tarde para comprobarlo :/
 
MetaDriver:

Oh, genial. Eso es fácil. ¡Eso es lo que hacemos! ¿Pero qué necesito? ¿En el nivel ?

Las estructuras que he propuesto son una forma estándar de crear nuevas entidades.

No hay necesidad de emocionarse por nada.

 
MetaDriver:

Actualmente, en mql5, tenemos que hacer muchos pasos extra y escribir mucho código torcido debido a la imposibilidad de pasar subarreglos a las funciones.

Estás hablando de punteros a trozos de memoria incontrolables, lo cual está completamente prohibido en MQL5.

En MQL5 cada objeto/tipo debe ser controlable - esto es un requisito directo para la seguridad del lenguaje.

Si necesitas pasar parte de un array, debes utilizar el paso de la referencia al propio array y su posición. Esto le dará un control total sobre la propia matriz.

 
Renat:

Estás hablando de punteros a trozos de memoria incontrolables, lo cual está completamente prohibido en MQL5.

En MQL5 cada objeto/tipo debe ser controlable - esto es un requisito directo para la seguridad del lenguaje.

2. Si quieres pasar parte de un array, utiliza pasar una referencia al propio array y la posición en el mismo. Esto funcionará para el control total de la propia matriz.

Además, es el único lugar donde no se implementa la nomenclatura, por lo que encaja bien en la ideología de la universalización de las entidades lingüísticas.

2. De todos modos: en primer lugar, está torcido, y en segundo lugar, no es universal en absoluto. Sugiera una manera(1) de copiar un array bidimensional mql en un buffer OpenCL sin reescribir y envolver innecesariamente en estructuras, o(2) usando (para la velocidad) su propia función ArrayCopy(...) para arrays no uniformes.

// Perdón por la brusquedad del post anterior. Realmente innecesario. Me emocioné con el "no compliquemos las cosas". Ya que sólo conduce a complicaciones.

2a. Creo que tu "restricción de unidimensionalidad" para funciones como ArrayCopy() se puede suavizar sin problemas en muchos casos con una cláusula elemental en los comentarios: " La función también funciona con matrices multidimensionales, siempre que la matriz multidimensional se copie en su totalidad. "

Muchos problemas desaparecerían. // Pero no todos, por supuesto.

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
MetaDriver:

1. Esa fue mi sugerencia de introducir la nomenclatura y, por lo tanto, la tipificación rígida, especialmente porque es el único lugar que no está cubierto por la nomenclatura, por lo que encaja bien con la ideología de la universalización de las entidades del lenguaje.

Me temo que no has querido darte cuenta de la coincidencia de la descripción:

typedef Int8 = int[8];
struct   Int8 { int arr[8]; };

La segunda forma es mucho más limpia, potente y controlable. No hay ninguna razón para inventar otro más débil utilizando el método existente.

2. hacer lo mismo. De todos modos: en primer lugar, está torcido, y en segundo lugar, no es universal en absoluto. Sugiera una forma(1) de copiar un array bidimensional mql en un buffer OpenCL sin reescribir y envolver innecesariamente en estructuras, o(2) de utilizar (por velocidad) su propia función ArrayCopy(...) para arrays no dimensionales.

En primer lugar, no está torcido. En segundo lugar, la seguridad es mayor que cualquier método de optimización del estilo de acceso directo a la memoria sin control. Es decir, la pregunta "¿cómo puedo verter directamente un bloque binario en una entidad controlada?" es una pregunta general y fundamental (mal resuelta) para todos los lenguajes.

Si tienes que lidiar con transferencias de arrays entre diferentes sistemas (en OpenCL), es importante pensar en una estructura de datos simple y directamente compatible.

Mira la clase más sencilla CLBufferWrite de función ligada para facilitar la transferencia de datos.

Archivos adjuntos:
 
Renat:

Estás hablando de punteros a trozos de memoria no controlados, lo cual está completamente prohibido en MQL5.

Y por cierto, estás condensando. El compilador conoce el tamaño de la matriz que se pasa en el momento en que se pasa el parámetro.

Incluso genera un error al intentar hacerlo. :) Otra cosa es que tendría que introducir una parametrización implícita adicional en cada llamada a la función (más o menos como me aconseja hacer explícitamente). Pero la solución por su parte sería mucho más universal, por ejemplo, utilizando su propia biblioteca estándar de funciones y objetos. El mismo ArrayCopy() y FileWriteArray() funcionarían sin problemas.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
papaklass:
Puedes acompañar tus afirmaciones con ejemplos sencillos, para gente como yo. MetaDriver te entiende, ¿pero la gente como yo no entiende de qué estamos hablando sin ningún ejemplo? Y quieres estar al tanto de lo que ocurre.

Me temo que esto será un sustituto de la documentación. Busca en un buscador, hay un montón de información por ahí.

Acceso seguro a algunos miembros de la matriz:

void MyFunc(double& array[],uint pos,uint size)
  {
   while(size>0)
     {
      Print("[",pos,"] = ",array[pos]);
      pos++;
      size--;
     }
  }

Teniendo en cuenta que el compilador está muy afinado para las funciones inline, de hecho, la función puede estar completamente integrada en el lugar de la llamada y toda la sobrecarga se reducirá a cero.

Esto significa que, en MQL5, no se puede tener miedo de escribir pequeñas funciones "correctas" - tienen un destino estándar completo en línea con la optimización adecuada.

Esto significa que se reducen los costes de transferencia de parámetros y de indexación.

 
MetaDriver:

Y por cierto, estás condensando. El compilador conoce el tamaño de la matriz que se pasa en el momento de pasar los parámetros.

¿Desde cuándo todas las matrices son estáticas, así como todos los índices y tamaños?

Como los arrays son casi siempre dinámicos y los índices son variables, no podemos hacer ninguna comprobación estática seria en el momento de una llamada. Sólo hay que hacer comprobaciones meta/rtti y por eso es tan importante tener acceso a todo el objeto/descripción y no trabajar en un trozo de memoria al azar.


El mismo ArrayCopy() y FileWriteArray() funcionarían sin problemas.

No te preocupes, todo está pensado desde hace tiempo.

Las consecuencias de romper los principios de seguridad que conocemos muy bien es el camino de "en abril arreglamos 12 bugs más críticos para salir de la máquina virtual y obtener el control del sistema".