Erreurs, bugs, questions - page 453

 
Interesting:

Ne créez pas d'objets dynamiques - vous n'aurez pas à utiliser maintenant et tout ce qui est lié à ces objets (mais alors vous ne pourrez pas faire beaucoup de choses).

Vous voulez comprendre non pas le sens de maintenant, mais le sens de travailler avec des objets dynamiques...

//////////////////////////////////////// SUIVEZ MON TEXTE (JE NE PEUX PAS SORTIR DE LA CITATION) :) //////////////////////////////////////////////////////////////

void OnStart()
{
//---
Primer obekt ;
obekt.f1() ;
}
//+------------------------------------------------------------------+
introduction à la classe
{
public :
void f1() ;

primer() ;
} ;

amorce::amorce()
{
Alert("Je pense que l'initialisation ici aussi se fait uniquement au moment de la création") ;
} ;

amorce::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]) ;
} ;

Ce code ne produit pas d'erreur et le tableau est dynamique. Pourquoi ????

Et si vous voulez le détruire :

{

obekt ;
obekt.f1() ;


}

Il semble qu'ils aient pris le C++, qu'ils aient gâché la gestion des adresses et qu'ils l'aient mis dans MQL.

 

220Volt:

PLUS LOIN, C'EST MON TEXTE (JE N'ARRIVE PAS À SORTIR DES GUILLEMETS) :)

Ce code ne donne pas d'erreur et le tableau est dynamique. Pourquoi ????

1. pourquoi doit-il être exécuté avec une erreur ?

a) L'objet est créé automatiquement (ceci est causé par la méthode de déclaration d'une instance d'objet dans OnStart) et est automatiquement supprimé.

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

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

obekt.f1();

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

Quant aux objets, leurs instances peuvent être créées automatiquement ou dynamiquement. Dans le premier cas, le constructeur est généralement exécuté pendant l'initialisation, dans le second cas, il est exécuté après l'utilisation de l'opérateur new.

b) Logiquement, il ne devrait pas non plus y avoir d'erreurs dans f1() (même si, personnellement, je l'aurais implémenté différemment).

Quant aux tableaux dynamiques. Ils diffèrent des tableaux statiques en ce que ces tableaux n'ont pas de dimension connue, ce qui signifie qu'avant de travailler avec un tel tableau, vous devez le spécifier en utilisant ArrayResize (vous devez spécifier une nouvelle taille dans la première dimension du tableau). Il est important de noter que les éléments du tableau sont numérotés à partir de 0.

2. Si vous êtes intéressé par le travail avec des objets dynamiques, veuillez étudier attentivement cet exemple - Tetris (bien que je n'arrive toujours pas à comprendre ce qu'il fait dans l'ancien forum)...

 

Je suis désolé de m'imposer, mais je veux vraiment aller au fond des choses. Je vais vous dire ce que je ne comprends pas.

Si nous regardons la notation C++ (nous avons une classe d'amorce déclarée)

amorce *ukazatel=nouvelle amorce ;

dit que ukazatel contient l'adresse en mémoire où notre objet, une copie de la classe d'amorce, est stocké. A partir de MQL les adresses sont supprimées, et ukazatel contient un descripteur d'objet. Qu'est-ce qu'on en retire ? La seule différence que j'ai remarquée est que si vous déclarez un objet à l'intérieur du bloc via new et que vous oubliez d'utiliser delete avant de terminer le bloc, alors l'objet ne sera supprimé que lorsque le programme sera terminé. Et après la sortie du bloc, la connexion avec cet objet via le handle sera perdue.

Je pensais que si l'objet est déclaré par new, la mémoire de l'objet est allouée dynamiquement (c'est-à-dire qu'il peut augmenter sa taille), et que s'il n'est pas déclaré par new, l'objet ne peut avoir que des variables statiques. Mais mon hypothèse n'a pas été confirmée (dans le script, que j'ai posté plus tôt, l'objet n'est pas déclaré par new, mais il traite une variable dynamique).

Et après toutes ces passions, je me retrouve dans une situation pas très agréable, et je ne comprends pas quelle est la différence avec new ou sans, et si le compilateur lui-même corrige quelque chose là, pourquoi devrais-je m'en préoccuper ?

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

J'ai même essayé de faire quelque chose comme ce qui est décrit dans la documentation (pour découvrir quelque chose sur les nouveautés) :

interrupteur(5)

{

cas 5 : m_shape=new CTetrisShape1; // cette option ne fonctionne pas du tout (et cela vient de la documentation !!!).! !!) seulement de cette façon

( m_shape=new CTetrisShape1 ; )

}

et maintenant nous ne pouvons pas accéder à l'objet m_shape.___, une erreur sera affichée

 

220Volt:

Et maintenant je me retrouve dans une situation pas très bonne après toutes ces passions, et je ne comprends pas quelle est la différence entre avoir du nouveau ou pas, et si le compilateur corrige quelque chose là, pourquoi devrais-je m'en préoccuper ?

Les instances d'objets sont créées dynamiquement à l'aide de l'opérateur new if (c'est pourquoi j'ai demandé à voir l'exemple de Tetris) :

1. Le nombre d'instances d'objets n'est pas connu à l'avance (mais on suppose qu'il y en aura toujours plus d'une) ;

2. Si on veut créer un tableau de pointeurs vers des objets "hétérogènes", qui ont le même ancêtre ;

3. s'il est supposé que l'objet (ou plutôt un pointeur vers cet objet) sera utilisé comme paramètre pour une procédure ou une fonction (vous devriez probablement le passer à la bibliothèque) ;

4. S'il est prévu de travailler avec un objet (lire : un pointeur vers cet objet) dans différentes parties du programme. Par exemple, le même objet "ordre" peut se trouver dans : un tableau d'ordres créés par le conseiller expert ; un tableau d'ordres pour un certain symbole ; un tableau d'ordres qui ont formé une certaine position, et ainsi de suite.

5. Il existe bien d'autres tâches qui sont résolues par l'application de vœux et de pointeurs créés dynamiquement.

 
220Volt:

J'ai même essayé de faire quelque chose comme ce qui est décrit dans la documentation (pour découvrir quelque chose sur les nouveautés) :

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

et maintenant nous ne pouvons pas accéder à l'objet m_shape.___, une erreur sera lancée

En fait, dans l'exemple de Tetris, elle est mise en œuvre de la manière suivante (remarquez que dans votre cas, l'opérateur break est absent)

   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;
     }

N'oubliez pas de vérifier si le pointeur est NULL.

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

Intéressant, merci pour votre aide
 

Les développeurs.

Dans la documentation, veuillez spécifier "explicitement" toutes les choses qui ne fonctionnent pas dans le testeur, ou qui fonctionnent avec certaines fonctionnalités (afin d'éviter les questions inutiles).

Par exemple, vous devez mentionner explicitement les particularités de l'heure locale et de l'heure GMT (assimilée à l'heure du serveur), ainsi que la nature problématique de TimeGMTOffset pour obtenir le résultat escompté.

 

Qui sait ? Existe-t-il un moyen normal de traduire un tableau de caractères Unicode en une chaîne de caractères ?

 
TheXpert:

Qui sait ? Existe-t-il un moyen normal de traduire un tableau de caractères Unicode en une chaîne de caractères ?

Il me semble que je devrais traduire chaque élément du tableau individuellement.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5