Erreurs, bugs, questions - page 216

 
Vigor:

J'ai rencontré un problème de débordement de la pile d'appels (c'est ce que je pense).

Après avoir appelé une méthode de l'un des objets, voir l'exemple ci-dessous. Le code est simplifié, juste l'essentiel. La classe CClass1 est une classe de base et list1 a différents objets qui sont des descendants de cette classe et leurs fonctions init sont implémentées différemment. Ainsi, dans une classe où la fonction init récupère une telle liste (pour faire simple, elle initialise une interface imbriquée, un panneau dans le panneau) après le retour de init dans la ligne

il y a une erreur

2010.12.02 00:21:00 test1 (EURUSD,H1) Accès au pointeur non valide dans 'Container.mqh' (74,10)

C'est-à-dire que le pointeur t est mort.

Lors du débogage, il n'y a pas d'erreur de ce type, après l'appel de la méthode, le pointeur est "vivant", les interfaces imbriquées sont créées et l'Expert Advisor continue de fonctionner.

C'est la seule façon de contourner l'erreur :

#propriété stacksize pointeur n'a rien donné.

Il est difficile de se prononcer avec certitude. Vous avez besoin du code source.

Essayez d'écrire une demande à Servicedesk.

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.
 

Je suis rentré de vacances, j'ai démarré les terminaux, j'ai mis à jour la version 360 et un indicateur a cessé de fonctionner...

Je lis les changements : 6. MQL5 : Correction du traitement de l'événement de clic sur un graphique.

Désormais, lorsque vous cliquez sur un objet graphique, deux événements sont générés en même temps : CHARTEVENT_OBJECT_CLICK + CHARTEVENT_CLICK, alors qu'auparavant il n'y avait qu'un seul CHARTEVENT_OBJECT_CLICK, ce qui permet de simuler un double clic.

Est-ce que ce sera toujours comme ça ou est-ce un bug ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 
AlexSTAL:

Je suis rentré de vacances, j'ai démarré les terminaux, j'ai mis à jour la version 360 et un indicateur a cessé de fonctionner...

lecture dans les changements : 6. MQL5 : Correction du traitement de l'événement de clic sur un graphique.

Désormais, lorsque vous cliquez sur un objet graphique, deux événements sont générés en même temps : CHARTEVENT_OBJECT_CLICK + CHARTEVENT_CLICK, alors qu'auparavant il n'y avait qu'un seul CHARTEVENT_OBJECT_CLICK, ce qui permet de simuler un double clic.

Est-ce que ce sera toujours comme ça ou est-ce un bug ?

Cela a été fait intentionnellement.
 

Une fois de plus, je me heurte au mur de l'impossibilité,

Je dois passer un paramètre au constructeur, afin que la classe soit initialisée avec certains paramètres,

Comment contourner ce problème ? Que recommandez-vous ?

 
Urain:

Une fois de plus, je me heurte au mur de l'impossibilité,

J'ai besoin de passer un paramètre au constructeur pour que la classe soit initialisée avec certains paramètres,

Comment puis-je contourner ce problème ?


к

Je ne vois pas d'autre issue.

class test{
  private:
    bool inited;
    int value;  
  public:
    void test(){
      inited = false;
    }
    
  bool Set( int passed ){
    value = passed;
    return(true);
  }
  bool Init( int passed ){
    if ( Set( passed ) ){
      inited = true;
      return(true);
    }
    return(false);
  }
  int Get( ){
    if( !inited ){
      Print("Объект неинициализирован");
      return(-1);
    }
    return(value);
  }
};

void OnStart()
  {
  
  
  test var;
  if( !var.Init(1)){
    Print("Ошибка инициализации объекта");
    return;
}
  Print(var.Get());
  
  test var2;
  Print( var2.Get() );
  }

et, bien sûr, vous devez mettre les Inits dans le bon ordre dans le cas de classes héritées

J'aimerais qu'ils écrivent un article sur la gestion des erreurs dans les projets complexes,Imprimer et retourner comme ici n'est pas la solution.

 
gdtt:

Eh bien, je ne vois pas d'autre issue.

Et, bien sûr, vous devez mettre les Inits dans le bon ordre dans le cas de classes héritées

En général, j'aimerais qu'ils écrivent un article sur la gestion des erreurs dans les projets complexes, Imprimer et retourner comme ici n'est pas la solution.

Il s'agit de créer un préconstructeur qui achèverait le processus de construction et qui, à son tour, afficherait un drapeau d'initialisation.

En général, c'est une bonne solution, mais il y a quelques inconvénients. Nous devons interroger chaque fonction avec un drapeau d'initialisation, et avec un grand nombre de fonctions de classe, ce n'est pas pratique.

Et si nous devions changer quelque chose, toutes les fonctions devraient être réécrites.

SZ J'ai modifié le code et corrigé la faute de frappe.

class test
  {
private:
   bool              inited;
   int               value;
public:
                     test(void){inited=false;};
   bool Set(int passed){value=passed;return(true);};
   bool Init(int passed)
     {
      if(Set(passed))inited=true;    
      return(inited);
     };
   int Get()
     {
      if(!inited)
        {
         Print("Объект неинициализирован");
         return(-1);
        }        
      return(value);
     };
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {

   test var;
   var.Init(1);
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }
 
Urain:

C'est-à-dire créer un pré-constructeur qui achèverait le processus de construction et qui, à son tour, activerait un drapeau d'initialisation.

En général, c'est cool, mais il y a quelques inconvénients. Nous devrons demander à chaque fonction le drapeau d'initialisation, et avec un grand nombre de fonctions de classe, ce n'est pas pratique.

Le code pour la première fois a été mis à jour de la même manière que pour la deuxième fois.

SZ J'ai modifié le code et corrigé l'erreur.

eh bien, s'il y avait un constructeur, cela ne signifierait pas que l'initialisation a réussi. dans tous les cas, vous devez vérifier le fait de l'initialisation.

Bien sûr, vous pouvez le vérifier une fois :

void OnStart()
  {

   test var;
   if( ! var.Init(1)){
     // здесь какято обрабтка
     return;
   };
   Print(var.Get());

   test var2;
   Print(var2.Get());
  }

Mais si vous utilisez votre propre code, vous pouvez en faire une règle pour vérifier le fait de l'initialisation au moment de l'appel, et s'il sera utilisé par d'autres, vous ne pouvez pas écrire dans les instructions : "vous devez utiliser uniquement cette construction, sinon je ne peux pas garantir les conséquences". Non, vous devez vérifier l'initialisation dans les méthodes de classe de toute façon.

 

Aux développeurs.

Immédiatement après le redémarrage de la nouvelle construction.


PS

La mise à jour du terminal installé dans un autre dossier a réussi, les symboles sont dans la liste (mais il n'y avait pas de graphiques ouverts avant la mise à jour)...

 

Dites-moi si c'est un bug ou si ce n'est pas autorisé.

ENUM_ORDER_TYPE Signal[21];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ArrayInitialize(Signal,WRONG_VALUE);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Il donne une erreur

'ArrayInitialize' - no one of the overloads can be applied to the function call 
 
sergey1294:

Veuillez me dire si c'est un bug ou si ce n'est pas autorisé.

Vous obtiendrez une erreur


Le plus probable est que ArrayInitialize() est destiné à remplir uniquement les tableaux d'un certain type, numérique pour être exact (très probablement int ou double).

Parce que le tableau a le type ENUM_ORDER_TYPE, l'appel de ArrayInitialize provoquera une erreur, disant que cette méthode d'appel n'est pas autorisée.

À mon avis, il y a deux options dans ce cas :

1. changer le type de tableau ENUM_ORDER_TYPE en int, tout en en tenant compte dans le code (au moins les types d'ordre peuvent être facilement représentés comme int) ;

2. Implémentation indépendante de l'"initialisation" du tableau.

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
Raison: