Errores, fallos, preguntas - página 453

 
Interesting:

No crees objetos dinámicos - no tendrás que usar ahora y todo lo relacionado con estos objetos (pero entonces no podrás hacer muchas cosas).

Quieres entender no el significado de ahora, sino el significado de trabajar con objetos dinámicos...

//////////////////////////////////////// SIGUE MI TEXTO (NO PUEDO SALIR DE LA CITA) :) //////////////////////////////////////////////////////////////

void OnStart()
{
//---
primer obekt;
obekt.f1();
}
//+------------------------------------------------------------------+
cartilla de la clase
{
público:
void f1();

primer();
};

primer::primer()
{
Alert("Creo que la inicialización aquí también es sólo en el momento de la creación");
};

primer::f1()
{
int l[];
ArrayResize(l,3);
l[0]=87;
l[1]=67;
l[2]=57;
ArrayResize(l,5);
l[3]=47;
l[4]=37;
Alert(l[0]," ",l[1]," ",l[2]," ",l[3]," ",l[4]);
};

Este código no produce un error y el array es dinámico. Por qué????

Y si quieres destruirlo:

{

obekt;
obekt.f1();


}

Parece que han cogido C++ y han estropeado el manejo de direcciones y lo han puesto en MQL

 

220Volt:

ADEMÁS ES MI TEXTO (NO PUEDO SALIR DE LA CITA) :)

Este código no da error y el array es dinámico. Por qué????

1. ¿Por qué debe ejecutarse con un error?

a) El objeto se crea automáticamente (esto es causado por el método de declarar una instancia de objeto en OnStart) y se elimina automáticamente

primer  obekt1;   //Конструктор будет вызван автоматически уже на этой строчке
 primer *obekt2; //Указатель на динамический объект

void OnStart()
{
obekt2 = new primer; //Конструктор выполняется вот тут 

obekt.f1();

delete(obekt2); //Тут выполняется деструктор (отсутствие delete приведет к утечки памяти в момент завершения работы скрипта)
}

En cuanto a los objetos, sus instancias pueden crearse automática o dinámicamente. En el primer caso, el constructor suele ejecutarse durante la inicialización, en el segundo caso se ejecuta después de utilizar el operador new.

b) Lógicamente, tampoco debería haber errores en f1() (aunque yo personalmente lo habría implementado de otra manera).

En cuanto a las matrices dinámicas. Se diferencian de los arrays estáticos en que dichos arrays no tienen una dimensionalidad conocida, lo que significa que antes de trabajar con un array de este tipo, debes especificarlo utilizando ArrayResize (debes especificar un nuevo tamaño en la primera dimensión del array). Es importante tener en cuenta que los elementos del array se numeran a partir de 0.

2. Si estás interesado en trabajar con objetos dinámicos, estudia detenidamente este ejemplo - Tetris (aunque sigo sin entender lo que hace en el antiguo foro)...

 

Siento entrometerme, pero quiero llegar al fondo de esto. Te diré en qué me equivoco.

Si nos fijamos en la notación de C++ (tenemos una clase declarada primer)

primer *ukazatel=nuevo primer;

dice que ukazatel contiene la dirección en memoria en la que se almacena nuestro objeto, una copia de la clase primer. De las direcciones MQL se eliminan, y ukazatel contiene un descriptor de objeto. ¿Qué conseguimos con ello? La única diferencia que he notado, es que si dentro del bloque declaramos mediante un nuevo objeto y olvidamos usar delete antes de terminar el bloque, entonces el objeto se borrará sólo cuando el programa haya terminado. Y después de la salida del bloque se perderá la conexión con este objeto a través de la manija.

Tenía la idea de que si se declara a través de new, entonces la memoria para el objeto se asigna dinámicamente (es decir, puede aumentar su tamaño), y si no new, entonces el objeto sólo puede tener variables estáticas. Pero mi suposición no se confirmó (la secuencia de comandos, que he publicado anteriormente, el objeto se declara no a través de nuevo, pero se trata de una variable dinámica).

Y después de todas estas pasiones estoy en una situación no muy agradable, y no entiendo cuál es la diferencia con nuevo o sin él, y si el propio compilador arregla algo allí, ¿por qué debería molestarme?

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

Incluso intenté hacer algo como lo que se describe en la documentación (para averiguar algo sobre lo nuevo) :

interruptor(5)

{

caso 5: m_shape=new CTetrisShape1; // esta opción no funciona en absoluto (¡¡y esto es de la documentación!!!!!) sólo de esta manera

( m_shape=nuevo CTetrisShape1; )

}

y ahora no podemos acceder al objeto m_shape.___, se mostrará un error

 

220Volt:

Y ahora me encuentro en una situación no muy buena después de todas estas pasiones, y no entiendo cuál es la diferencia con nuevo o sin él, y si el compilador arregla algo allí, ¿por qué debería molestarme?

Las instancias de objetos se crean dinámicamente utilizando el operador new if (por eso pedí ver el ejemplo del Tetris):

1. El número de instancias del objeto no se conoce de antemano (pero se supone que siempre habrá más de una);

2. Si se quiere crear un array de punteros a objetos "heterogéneos", que tienen el mismo ancestro;

3. si se supone que el objeto (o más bien un puntero a este objeto) se utilizará como parámetro para un procedimiento o función (probablemente debería pasarlo a la biblioteca);

4. Si se pretende trabajar con un objeto (léase: un puntero a este objeto) en diferentes partes del programa. Por ejemplo, el mismo objeto "orden" puede estar en: una matriz de órdenes creadas por el Asesor Experto; una matriz de órdenes para un determinado símbolo; una matriz de órdenes que formaron una determinada posición, etc.

5. Hay muchas más tareas que se resuelven aplicando votos y punteros creados dinámicamente.

 
220Volt:

Incluso intenté hacer algo como lo que se describe en la documentación (para averiguar algo sobre lo nuevo) :

........................

y ahora no podemos acceder al objeto m_shape.___, se lanzará un error

En realidad, en el ejemplo del Tetris se implementa de la siguiente manera (fíjate que en tu caso falta el operador de ruptura)

   switch(nshape)
     {
      case 0: m_shape=new CTetrisShape1; break;
      case 1: m_shape=new CTetrisShape2; break;
      case 2: m_shape=new CTetrisShape3; break;
      case 3: m_shape=new CTetrisShape4; break;
      case 4: m_shape=new CTetrisShape5; break;
      case 5: m_shape=new CTetrisShape6; break;
      case 6: m_shape=new CTetrisShape7; break;
     }

No olvides comprobar si el puntero es NULL

 if(m_shape!=NULL)
 {
//С указателем можно работать
 }
 

Interesante gracias por su ayuda
 

Los promotores.

En la documentación, por favor, especifique "explícitamente" todas las cosas que no funcionan en el probador, o que funcionan con ciertas características (para que no surjan preguntas innecesarias).

Por ejemplo, debe mencionar explícitamente las peculiaridades de la hora local y la hora GMT (equiparada a la hora del servidor), así como la naturaleza problemática de TimeGMTOffset para obtener el resultado esperado.

 

Quién sabe... ¿existe una forma normal de traducir una matriz de caracteres Unicode a una cadena?

 
TheXpert:

Quién sabe... ¿existe una forma normal de traducir una matriz de caracteres Unicode a una cadena?

Me parece que tendría que traducir cada elemento de la matriz individualmente.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
Razón de la queja: