OLP. Problèmes d'application - page 13

 
TheXpert:
Montrez-moi un exemple pour qu'il n'y ait pas de confusion, puis je répondrai.

//1-ый вариант. Переменная-член strA инициализируется автоматически
class A
  {
public:
   string            strA;
                     A(void) { Print("strA=",strA); };
                    ~A(void){};
  };
//2-ой вариант. Переменная-член strB инициализируется при помощи инициализатора пользовательским значением
class B
  {
public:
   string            strB;
                     B(const string str) : strB(str) { Print("strB=",strB); }
                    ~B(void){};
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   A a1;
   B b1("Пользовательское значение");
  }

Un exemple est simple. Supposons que 15 "cycles informatiques" soient consacrés à l'initialisation automatique du membre a1.strA. J'en suis arrivé à la conclusion préliminaire que 15 cycles sont également consacrés à l'initialisation du membre b1.strB. Est-ce correct ?

 

Dans la classe CExpert de la bibliothèque standard, il y a ces déclarations gardées

//--- trading objects
CExpertTrade     *m_trade;    // trading object
CExpertSignal    *m_signal;   // trading signals object
CExpertMoney     *m_money;    // money manager object
CExpertTrailing  *m_trailing; // trailing stops object

En même temps, le constructeur de cet objet contient les chaînes suivantes

m_trade    =NULL;
m_signal   =NULL;
m_money    =NULL;
m_trailing =NULL;

J'ai essayé de créer quelque chose de similaire dans ma classe, mais sans aucune autre initialisation (comme Init et InitXXX).

Le compilateur a tout compilé sans aucun avertissement ni aucune erreur, mais il présentait une erreur critique 281 (Accès invalide au pointeur) et l'EA a été supprimé du tableau.

À cet égard, j'ai quelques questions :

1. Que dois-je faire dans le constructeur (spécifier NULL ou spécifier le pointeur vers l'objet spécifique) ?

2. L'initialisation du pointeur de type InitTrade est-elle obligatoire ?

 
Interesting:

Dans la classe CExpert de la bibliothèque standard, on trouve les déclarations protégées suivantes

En même temps, le constructeur de cet objet contient les chaînes suivantes

J'ai essayé de créer quelque chose de similaire dans ma classe, mais sans aucune autre initialisation (comme Init et InitXXX).

Le compilateur a tout compilé sans aucun avertissement ni aucune erreur, mais lorsque j'ai essayé d'installer l'EA sur le graphique, il a obtenu une erreur critique 281 (accès au pointeur non valide) et l'EA a été supprimé du graphique.

À cet égard, j'ai quelques questions :

1. Que dois-je faire dans le constructeur (spécifier NULL ou spécifier le pointeur vers l'objet spécifique) ?

2. L'initialisation du pointeur de type InitTrade est-elle obligatoire ?

1. Les deux sont corrects. Tout dépend de l'implémentation particulière de la classe (pas spécifiquement CExpert). Cependant, il est préférable de créer des objets dynamiques avec la méthode InitXXX, qui renvoie un bool (car le constructeur ne renvoie pas le résultat de l'exécution et vous devrez réinitialiser le drapeau d'initialisation et ensuite l'analyser (le drapeau).

2. Bien sûr qu'elle l'est. Sinon, l'erreur critique 281 (Accès au pointeur non valide) se produira.

PS. Merci au passage. Je vais devoir insérer des contrôles de pointeurs avant utilisation.

 
Yedelkin:

Un exemple est simple. Supposons que 15 "cycles informatiques" soient consacrés à l'initialisation automatique du membre a1.strA. J'en suis arrivé à la conclusion préliminaire que 15 cycles sont également consacrés à l'initialisation du membre b1.strB. Est-ce correct ?

Non, ce n'est pas du tout les tacts. Ou peut-être que ce n'est pas vraiment une question d'horloge.
 
TheXpert:
Non, ce n'est pas du tout à propos de l'horloge. Enfin, pas vraiment à propos de l'horloge.

OK, alors une question très simple : lequel est le plus rapide à initialiser dans le temps, le membre a1.strA ou le membre b1.strB de l'exemple ci-dessus ?

Ou quoi lire "point par point" ? Physiquement, il n'y a aucun moyen d'apprendre la programmation au niveau d'une "machine-processeur".

 
Yedelkin:

OK, alors une question très simple : lequel est le plus rapide à initialiser dans le temps, le membre a1.strA ou le membre b1.strB de l'exemple ci-dessus ?

Ou quoi lire "point par point" ? Il n'y a physiquement aucun moyen d'apprendre la programmation à un niveau "machine-processeur".

a1.strA s'initialisera plus rapidement car son processus d'initialisation consiste simplement à mettre à zéro sur place. Pour b1.strB, une allocation de mémoire sera effectuée.

Toutefois, cette différence est assez difficile à mesurer, car elle est bien inférieure à un pour cent, compte tenu du code entourant l'initialisation

 
Yedelkin:

qui initialise plus rapidement

la question est incorrecte.
 
stringo:

Pour b1.strB, une allocation de mémoire sera effectuée.

Voilà, merci - le chaînon manquant dans ma logique.

TheXpert, merci pour votre aide. J'ai essayé d'expliquer le point avec mes propres mots. Je suis d'accord pour dire qu'une question vraiment correcte est posée par ceux qui sont au courant. Mais ils ne posent généralement pas de questions de mon niveau :)

 
uncleVic:

1. Il est correct dans les deux sens. Tout dépend de l'implémentation spécifique de la classe (pas spécifiquement CExpert). Cependant, il est préférable de créer des objets dynamiques dans la méthode InitXXX, qui renvoie un bool (car le constructeur ne renvoie pas le résultat de l'exécution et nous devrons réinitialiser/désactiver le drapeau d'initialisation et ensuite l'analyser (le drapeau).

2. Bien sûr que oui. Sinon, erreur critique 281 (accès au pointeur non valide).

PS. Merci au passage. Je vais devoir insérer des contrôles de pointeurs avant utilisation.

Merci, maintenant tout est à sa place. Cependant, il y a une autre question. Supposons que l'erreur 281 se produise, mais il est préférable que l'Expert Advisor ne soit pas déchargé. Que dois-je faire ?

Permettez-moi de clarifier ma question - Que faire si une erreur de 281 se produit après toutes les étapes de l'initialisation, mais qu'elle n'affecte pas le travail principal du conseiller expert de manière suffisamment critique pour ne pas l'exécuter du tout ?

 
Interesting:

Supposons que l'erreur 281 se produise, mais qu'il est souhaitable que l'EA ne soit pas déchargée. Que devons-nous faire alors ?

Permettez-moi de clarifier ma question : Que faire si l'erreur 281 se produit après toutes les étapes de l'initialisation, mais qu'elle n'affecte pas le travail principal du conseiller expert de manière suffisamment critique pour ne pas l'exécuter du tout ?

"Accès à un pointeur non valide" =="Tentative d'accès à un pointeur non valide" ? Si oui, alors

Une tentative d'accès à un pointeur invalide provoque un plantage du programme. C'est pourquoi il est nécessaire d'utiliser la fonction CheckPointer() avant d'utiliser un pointeur. Un pointeur peut être invalide dans les cas suivants

  • le pointeur est NULL;
  • si l'objet a été détruit par l'opérateur delete
  • .