Erreurs, bugs, questions - page 713

 
speedy:

Le bouton Compiler est perdu à jamais (vous devez recharger l'éditeur pour le récupérer).

Eh bien, pas exactement... :) J'ai réussi à le récupérer :)

Vous devez commenter la partie récursive et appuyer sur le bouton de compilation de débogage pour le faire.

 
speedy:

1. il n'est pas sûr d'"exposer" à l'extérieur des éléments internes qui ne font pas partie de la classe de base (et dans cet exemple, pas l'attribut lui-même, mais seulement un élément de tableau!) De plus, il n'est pas possible de modifier sa valeur.

En outre, cela contredit l'"esprit" de la programmation orientée objet : tout le travail sur les données de l'objet doit être effectué à l'intérieur de l'objet, par ses propres méthodes...

3. pourquoi ne pas utiliser simplement le Setter pour l'attribut de données ?

4. le code gagnerait en lisibilité.

5. finalement, cette "simplicité" avec l'indexeur de valeur l fera que personne, y compris vous, ne comprendra comment ce code fonctionne...

6. Vous passerez plus de temps à chercher des erreurs qu'à écrire Setter.

C'est quoi, de l'humour noir ?

Je comprends que la paranoïa est en vogue ici, et c'est un argument de rebut pour "pourquoi vous ne devriez pas faire ça". Je n'y vois aucun danger. Je l'ai examiné attentivement, le cas échéant. Après tout, tout nom est une référence. L'indexation n'est qu'une extension du concept de nom. Rien de plus. Interdisons complètement l'attribution de noms. Pour des raisons de sécurité. Les liens sont extrêmement dangereux, n'est-ce pas ?

2. cette logique contredit violemment l'esprit de la programmation orientée objet avec C++, C#, Delphi et quelques dizaines de langages moins populaires où les indexeurs fonctionnent très bien à droite comme à gauche. De plus, le bon sens et mon esprit ne contredisent pas cela pour une raison quelconque.

Les indexeurs sont faits pour communiquer avec l'environnement externe. Leur fonction est exactement celle d'une interface. Je peux encapsuler et cacher n'importe quoi, mais j'ai besoin d'index pour opérer avec des objets comme des tableaux. En fait, tous les tableaux sont organisés d'une manière ou d'une autre. Par exemple, les tableaux mql dynamiques réguliers. Interdisons de les placer à gauche de l'opérateur d'affectation et remplaçons-les par une fonction comme SetArrayValue(array, i, j, value) ; cela améliorera en même temps la lisibilité. Et le débogage sera également beaucoup plus facile. Ugh...

3. Pourquoi ne pas faire un indexeur normal ? La bonne est cool, bien sûr, mais la reine est encore meilleure.

4. C'est là que je commence vraiment à perdre la tête. C'est illisible ?

  t[i]=i*i;

C'est plus lisible, n'est-ce pas ?

  t.setDataElement(i, i*i);

Cool. Je pense que je vais aller me faire soigner.

5. Cool.

6. J'ai pleuré.


 

L'indicateur a cessé de compiler sur la version 630 :

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
 //код
 for(int i=limit; i<rates_total && !IsStopped(); i++)
  {
   if()
    {
     //~400 стр. кода
     // i используется много раз
     // тут же определяется RT=true или false
    }
   if(RT)
    {
     double p=close[i];  // 'i' - undeclared identifier
    }
  }
 return(rates_total);  // 'rates_total' - undeclared identifier
}

L'erreur c i peut être éliminée en plaçant une annonce devant for

int i;
for(i=limit; i<rates_total && !IsStopped(); i++)
{

}

Et que faire avec'rates_total' - undeclared identifier ?

Même chose sur Win7 x64 et XP x32.

 

Pouvez-vous me dire, s'il vous plaît. MathMin() et MathMax() sont-ils implémentés comme des fonctions (avec desparamètres passés par la pile) ou des substitutions de macro(en ligne) ? Selon le livre de référence, il s'agit de fonctions.

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

L'indicateur a cessé de compiler sur la version 630 :

L'erreur c i peut être éliminée en plaçant une annonce devant for

Et que faire avec'rates_total' - undeclared identifier ?

Même chose sur Win7 x64 et XP x32.

Il doit y avoir une erreur dans votre code quelque part. Le bloc que vous avez fourni compile sans erreur si vous déclarez les variables limit, RT et la condition if()
 
Rosh:
Vous avez clairement une erreur quelque part dans votre code. Le bloc soumis compile sans erreur si vous déclarez les variables limit, RT et mettez la condition if()

Naturellement, je n'ai pas donné le code, mais une structure approximative.

Sur la version 619, l'indicateur a été compilé et a fonctionné correctement.

Sur 630, il génère les erreurs ci-dessus.

Le code est 100% inchangé. La façon dont le compilateur fonctionne a évidemment changé.

 
Veuillezécrire au Service Desk et joindre le code source. Cela aidera les développeurs à trouver la cause et à la réparer.
 
speedy:

Bug ?

Le code ci-dessous génère une sorte de boucle perpétuelle dans le compilateur. Cliquer sur Annuler

ne fonctionne pas immédiatement, mais quand il le fait, il reprend le contrôle de l'éditeur.

Le bouton d'annulation lui-même ne disparaît pas, mais il n'est pas accessible non plus.

Le bouton Compiler est perdu à jamais (vous devez recharger l'éditeur pour le récupérer).

Merci pour le post, l'erreur de compilation a été corrigée.
 
victorg:

Veuillez me conseiller. MathMin() et MathMax() sont-ils réalisés comme des fonctions (avec desparamètres passés par la pile) ou comme des macrosubstitutions(inline) ? Selon le livre de référence, il s'agit de fonctions.

Bien sûr les fonctions, car au moment de la compilation les valeurs des arguments sont inconnues. IMHO inline et macros sont différents.

P.S. : en ligne ou pas en ligne, je ne saurais dire.

 
220Volt:

Bien sûr les fonctions, car au moment de la compilation les valeurs des arguments sont inconnues. IMHO inline et macros sont différents.

P.S. : je ne peux pas dire si elles sont en ligne ou non.

Une macro et une fonction en ligne sont en effet des choses différentes. Mais ce n'est pas ce que je veux dire. Voici un exemple lorsqu'au moment de la compilation les valeurs des arguments sont inconnues

#define  min(a,b) (((a)<(b))?(a):(b))
double func(a,b)
  {
  c=min(a,b);   // 1-й вариант
  c=fmin(a,b);  // 2-й вариант
  return(c);
  }

Dans le premier cas, le code doit être collé dans la fonction courante (je suppose) et dans le second cas, la fonction est appelée avec des paramètres passés par la pile (je suppose). Mais pour des raisons d'optimisation, le compilateur peut aussi implémenter la seconde variante par substitution. C'est vrai? Je ne sais pas. C'est pourquoi j'ai demandé.

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