Erreurs, bugs, questions - page 2046

 
A100:

Dans un terminal 32 bits, une erreur sur toute OPTIMIZE

Réel. Vérifié dans MT4, il y a effectivement des erreurs de quelque façon que ce soit. Et comment les gens codent quelque chose là sur les nouvelles constructions.
 
Alexey Navoykov:

Ici, 'b' est initialisé par NOT une expression constante. Cela va donc à l'encontre des règles décrites dans la documentation.

Comment l'initialisation peut-elle être interrompue ? Toutes les opérations sont effectuées dans un ordre strict défini par la syntaxe du langage. Tout d'abord, la fonction est exécutée, puis la valeur renvoyée par cette fonction est transmise au constructeur de notre variable - c'est ce qu'on appelle l'initialisation. Mais l'opération d'initialisation est ignorée de manière flagrante par le compilateur dans ce cas, et le code continue de compiler comme si rien ne s'était passé. C'est inacceptable. C'est la même chose que si vous déclariez, par exemple, le tableau suivantint a[]= { f(), g(), h() } ; et cela compilerait, mais bien sûr sans initialiser quoi que ce soit.

Si ce n'est pas par une expression constante, alors par QUOI ???

Alexey, c'est plus facile si vous prenez ce code vous-même et regardez la séquence d'initialisation dans le débogueur. De plus, je n'ai pas remarqué immédiatement que le code de l'élément

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

Alexey Navoykov, 2017.10.17 20:31

Et voici d'autres informations sur l'initialisation des variables. Si vous suivez ce qui a été mentionné dans la documentation, alors vous ne pouvez pas faire référence à d'autres variables globales/statiques également. Comme il ne s'agit pas d'une expression constante :

int a= 1;
int b= a+1;  // Согласно документации, такая инициализация не возможна

void OnStart()
{
  Print(b);
}

Cependant, pour l'instant, cela fonctionne. Et je suppose que de nombreuses personnes ont toujours utilisé de telles constructions sans s'en rendre compte. Mais il s'avère que les développeurs peuvent le désactiver à tout moment. Et, comme dans le cas de l'initialisation des fonctions, ces codes seront toujours compilés avec succès, mais ils ne fonctionneront pas correctement. Donc, l'ensemble du code MQL est une bombe à retardement.


Il s'agit des variables de niveau global, et non des variables statiques situées à l'intérieur d'une fonction.

Je n'ai pas assez de connaissances pour l'expliquer, et vous n'êtes pas assez attentif. "suspendu" entre guillemets ! !!

Ne confondez pas l'initialisation des variables statiques et ordinaires, d'autant plus pour les variables locales.

 
Alexey Viktorov:

Si ce n'est pas par une expression constante, alors par quoi ?

Une expression non constante.

Aussi, je n'ai pas immédiatement remarqué Le point principal est que cet exemple parle de variables de niveau global et non de variables statiques situées dans une fonction.

Je n'ai pas assez de connaissances pour l'expliquer de manière claire, et vous n'avez pas la capacité d'attention...

Vous ne confondez pas quelque chose ?

De plus, les variables globales et statiques se comportent de manière absolument identique. Voici la documentation:

Une variable globale ne peut être initialisée que par une constante ou une expression constante correspondant à son type.

Je dois avouer que ce fut autant une révélation pour moi que pour les variables statiques. Je ne sais pas quand tout cela est apparu dans la documentation ou peut-être était-ce plus tôt, mais personne n'y a prêté attention, car tout fonctionnait en fait comme en C++, et aucune question ne se posait.

 
Alexey Navoykov:

Une expression non constante.

Tu ne confonds pas les choses ?

En outre, les variables globales et statiques se comportent exactement de la même manière. Voici un extrait de la documentation :

Je dois avouer que cela a été pour moi une révélation tout autant que pour les variables statiques. Je ne sais pas quand tout cela est apparu dans la documentation. C'était peut-être plus tôt, mais personne n'y a prêté attention puisque tout fonctionnait en C++ et qu'aucune question ne se posait donc.

Je pense que vous avez tout à fait tort. Comment peut-on parler de l'identité des variables, si certaines sont disponibles dans toutes les fonctions définies dans le programme et d'autres uniquement dans la fonction dans laquelle elles sont déclarées.

Et la différence entre les variables statiques et locales est que les variables statiques sont initialisées immédiatement après les globales, et les locales ordinaires (non statiques) au fur et à mesure de l 'exécution du programme, lorsque le code les atteint.

 
Alexey Viktorov:

Il me semble que vous vous trompez complètement. Comment peut-on parler de variables identiques si certaines sont accessibles depuis toutes les fonctions définies dans le programme, et d'autres uniquement dans la fonction dans laquelle elles sont déclarées.

Vous parliez du contexte spécifique de la discussion(initialisation des variables), pas en général.

 
Après avoir envoyé des messages via le chat complet, le message envoyé n'est pas automatiquement ajouté à l'historique du chat de la page actuelle.
Le message envoyé n'apparaît qu'après avoir rechargé la page.

Juste un coup d'œil rapide, la réponse du serveur lors de l'envoi du message est adéquate, peut-être que quelque chose s'est mal passé dans les gestionnaires d'événements dans le code js.
 
Alexey Navoykov:

Il s'agissait du contexte spécifique de la discussion(initialisation des variables), pas en général.

Autant que je me souvienne, il s'agissait d'initialiser une variable STATIQUE.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

Alexey Navoykov, 2017.10.17 17:16

Bug avec l'initialisation des variables statiques. Il n'était pas présent dans les anciennes versions.

class A
{
 public:
  static int f()
  { 
    static int a=1;
    Print(a);       // Получаем a=0 !!
    return a;  
  }   
};


int a= A::f();


void OnStart()
  {
   
  }

Si ça ne vous dérange pas, envoyez-le au service d'assistance. Je n'ai plus aucune envie de communiquer avec eux là-bas.


Ou ce n'est pas votre message ?

Réglez déjà la séquence d'initialisation des variables. Dans cet exemple, une variable globale est d'abord initialisée.

int a= A::f();

qui appelle une fonction qui n'a pas encore initialisé une variable du même nom.

static int a=1;

Et de quoi pouvons-nous parler si vous ne faites pas attention aux avertissements du compilateur...


 
Alexey Navoykov:

Mais j'ai défini la mauvaise dimension du tableau, ce qui a pu l'affecter d'une manière ou d'une autre (alors que cela ne devrait pas l'affecter du tout).

Essayez ceci avec la dimension = 3

Merci pour le message.
En effet, c'est une erreur de l'optimiseur du compilateur.
La correction sera incluse dans la prochaine version.
 
Alexey Viktorov:

Autant que je me souvienne, il s'agissait d'initialiser une variable STATIQUE.

Ou ce n'est pas votre message ?

Je ne comprends pas ce que vous voulez. J'ai dit qu'il s'agissait de "l'initialisation des variables". Et dans ce contexte, les variables statiques et globales se comportent de manière identique. Je vous ai même donné un lien vers la documentation :initialisation des variables

Notez que les variables statiques et globales sont partout réunies.

Et nous ne critiquons pas la séquence d'initialisation parce qu'elle n'est pas liée au problème à résoudre. Je vous rappelle que le problème est que le compilateur ne génère PAS d'erreur là où il le devrait. Si une variable statique n'est toujours pas initialisée, vous ne pouvez pas y accéder.

Et de quoi pouvons-nous parler si vous ignorez les avertissements du compilateur...

Eh bien, changez le nom de la variable globale, si ça vous dérange tant que ça. Cela n'affectera en rien le résultat.

 
Alexey Navoykov:

Je ne comprends pas ce que vous voulez. J'ai dit qu'il s'agissait de "l'initialisation des variables". Et dans ce contexte, les variables statiques et globales se comportent de manière identique. Je vous ai même donné un lien vers la documentation :initialisation de variable

Notez que les variables statiques et globales sont partout réunies.

Et nous ne critiquons pas la séquence d'initialisation parce qu'elle n'est pas liée au problème à résoudre. Je vous rappelle que le problème est que le compilateur ne génère PAS d'erreur là où il le devrait. Si une variable statique n'est toujours pas initialisée, vous ne pouvez pas y accéder.

Eh bien, changez le nom de la variable globale, si ça vous dérange tant que ça. Cela n'affectera en rien le résultat.

Bonjour, nous y voilà... Avez-vous lu le lien vous-même ?

En dehors de mql je ne connais aussi, pas très bien, que VBA et c'est seulement là que j'ai rencontré la directive demandant l'initialisation des variables. Notez que c'est à la seule discrétion du programmeur. Et vous voulez que MQ force l'initialisation d'absolument toutes les variables ? Et changer la séquence d'initialisation à chaque demande de ces utilisateurs ? On vous a donné la possibilité de déroger aux règles, en comprenant ce que vous faites, et vous demandez d'exclure une telle possibilité ? ??

Il semble que vous ne cherchiez qu'à vous en prendre au langage mql et à le salir. Supprimez le caractère statique d'une variable dans une classe et vous serez heureux.

Raison: