Erreurs, bugs, questions - page 1149

 

Salutations à la communauté respectée.

Je n'ai pas pu le trouver sur le site web, et je n'ai pas compris moi-même pendant une demi-journée, pourquoi ce code écrit une erreur. Dites-moi si vous le pouvez.

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   string nameObject="testObject";
   ChartRedraw(0);
   ResetLastError();
   if(ObjectFind(0,nameObject)>=0){
      if(!ObjectDelete(0,nameObject)){
         if(_LastError>0){
            Print("1 Ошибка №",_LastError);
            ResetLastError();
         }
      }
   }
   ChartRedraw(0);
   if(_LastError>0){
      Print("2 Ошибка №",_LastError); // Тут ошибка №4202 <Графический объект не найден>
      ResetLastError();
   }
   if(!ObjectCreate(0,nameObject,OBJ_LABEL,0,0,0)){
      if(_LastError>0){
         Print("3 Ошибка №",_LastError);
         ResetLastError();
      }
   }else{
      ObjectSetInteger(0,nameObject,OBJPROP_CORNER,1);
   }
   if(_LastError>0){
      Print("4 Ошибка №",_LastError);
      ResetLastError();
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
svds75:

Salutations à la communauté respectée.

Je n'ai pas pu le trouver sur le site web, et je n'ai pas compris moi-même pendant une demi-journée, pourquoi ce code écrit une erreur. Dites-moi si vous le pouvez.

Pourquoi supprimer l'objet ?
 
sergeev:
pourquoi supprimer un objet ?
Le programme est en fait plus compliqué que cela. Je l'ai déjà simplifié hors de toute proportion pour voir quel est le problème. Mais je ne comprends toujours pas.
 
svds75:
Le programme est en fait plus complexe. Je l'ai déjà simplifié hors de toute proportion pour voir quel est le problème. Mais je ne le comprends toujours pas.
Essayez de comprendre pourquoi il n'y a qu'un seul message et pas toutes les coches, alors il n'y aura pas de questions.
 
svds75:
En fait, le programme est plus complexe. Je l'ai déjà simplifié hors de toute proportion pour voir quel est le problème. Mais je ne le comprends toujours pas.

à en juger par le style du code, il peut encore être simplifié.

Je me suis peut-être trompé dans le if/else ?

 
svds75:

Salutations à la communauté respectée.

Je n'ai pas pu le trouver sur le site web, et je n'ai pas compris moi-même pendant une demi-journée, pourquoi ce code écrit une erreur. Dites-moi si vous le pouvez.

Le code est plus lisible dans cette disposition et l'erreur est immédiatement visible :

//---
   string nameObject="testObject";
   ChartRedraw(0);
   ResetLastError();
   if(ObjectFind(0,nameObject)>=0)     // конечно объект не найден
     {
      if(!ObjectDelete(0,nameObject))
        {
         if(_LastError>0)
           {
            Print("1 Ошибка №",_LastError);
            ResetLastError();
           }
        }
     }
   ChartRedraw(0);
   if(_LastError>0)
     {                                 // поэтому сразу переходим сюда:
      Print("2 Ошибка №",_LastError);  // Тут ошибка №4202 <Графический объект не найден>
      ResetLastError();
     }
 
mql5:
Essayez de comprendre pourquoi il n'y a qu'un seul message et pas toutes les coches, alors vous n'aurez plus de questions.
Je suis désolé, je ne comprends pas. Peut-être connaissez-vous la réponse, et m'avez-vous donné un indice. J'y ai aussi pensé, j'aimerais que vous me disiez quelle fonction, ObjectFind() ou ObjectDelete(), fait une erreur dans _LastError, ou toute autre, peut-être que je comprendrais.
sergeev:

à en juger par le style du code, il peut encore être simplifié. commentez un peu

peut-être confus dans le if/else ?

J'ai essayé de nombreuses variantes (même dans ce code), sans parler du lieu d'application. Et if/else ci-dessous, il semble que vous pouvez le supprimer et que l'erreur demeure.

Dans l'ensemble, il peut être contourné. Vous devez écrire plus de code pour vérifier l'objet après l'avoir traité décemment. Je trouve qu'il est plus facile de le supprimer et de le recréer avec les paramètres nécessaires, car ses paramètres changent plusieurs fois pendant l'exécution. C'est ce que j'ai rencontré et c'est pourquoi je demande.

 
barabashkakvn:

Cela rend le code plus facile à lire et montre l'erreur immédiatement :

Quelle est l'erreur ? Même si vous savez que l'objet n'existe pas, ne pouvez-vous pas vérifier s'il existe ?

Quant au design, comme on dit, "pour le goût et la couleur...".

 
svds75:

Qu'est-ce qu'il y a de mal à ça ? Même si vous savez que l'objet n'existe pas, ne pouvez-vous pas vérifier son existence ?

Quant au design, comme on dit, "le goût et la couleur...".

ObjectFind

Valeur retournée

Sila fonction réussit, elle renvoie le numéro de la sous-fenêtre (0 signifie fenêtre principale du graphique) dans laquelle se trouve l'objet trouvé. Si l'objet n'est pas trouvé, la fonction renvoie un nombre négatif. Pour obtenir des informations supplémentaires sur l'erreur, appelez la fonction GetLastError().

Si l'objet n'est pas trouvé, il s'agit d'une erreur. À ce moment-là, la fonctionObjectFind elle-mêmerenverra un nombre négatif et le numéro d'erreur pourra être obtenu.

C'est plus clair :

//---
   string nameObject="testObject";
   ChartRedraw(0);
   ResetLastError();
   int find=ObjectFind(0,nameObject);
   if(find>=0)     // конечно объект не найден
     {
      if(!ObjectDelete(0,nameObject))

Exécutez-le en débogage et voyez la valeur de la variable"find".

 
svds75:
Je suis désolé, je ne comprends pas. Peut-être connaissez-vous la réponse et m'avez-vous donné un indice. J'y ai aussi pensé - si vous m'aviez dit quelle fonction, ObjectFind() ou ObjectDelete(), génère une erreur dans _LastError, ou toute autre, peut-être comprendrais-je.

J'ai essayé de nombreuses variantes (même dans ce code), sans parler du lieu d'application. Et if/else ci-dessous il semble être possible de le supprimer et l'erreur reste.

Dans l'ensemble, il peut être contourné. Vous devez écrire plus de code pour vérifier l'objet après l'avoir traité décemment. Je trouve qu'il est plus facile de le supprimer et de le recréer avec les paramètres nécessaires, car ses paramètres changent plusieurs fois pendant l'exécution. C'est ce que j'ai rencontré et c'est pourquoi je demande.

Il n'y a qu'un seul message, parce qu'au premier appel de OnCalculate l'objet n'existe pas et ObjectFind génère une erreur, puis l'objet est créé, donc les appels suivants à ObjectFind dans OnCalculate fonctionnent sans erreur.