Caractéristiques du langage mql5, subtilités et techniques - page 159

 
Yurixx:

Pouvez-vous me dire s'il vous plaît, s'il vous plaît.

Dans l'indicateur, l'ordre des séries, par exemple close[], est défini par ArraySetAsSeries() une fois ou d'une autre manière ?

Est-ce fait dans OnCalculate() ou dans OnInit() ?

J'ai rencontré une situation confuse :

L'ordre dans close[], fixé par AS_SERIES à l'entrée sur le premier tick, sur le tick suivant passe spontanément à la normale, c'est-à-dire !AS_SERIES.

Je n'ai pas trouvé la raison de ce phénomène dans le code.

dans toute fonction utilisant le scalaire &arr[] vous ne pouvez pas être absolument sûr de la direction d'indexation du tableau:-(

De plus, si vous modifiez la "sérialité" à l'intérieur, cette direction restera après la fin de votre fonction... ce sera un effet secondaire, auquel personne ne s'attend...

c'est pourquoi, malheureusement, lorsque vous recevez un tableau en entrée d'une fonction, souvenez-vous de sa sérialisation, définissez-la à un format pratique et renvoyez TOUJOURS l'original lorsque vous quittez la fonction.

Il s'agit d'un cas rare avec OnCalculate, mais en pratique, il était également appelé par d'autres codes.

 
Maxim Kuznetsov:

De plus, si vous modifiez la "sérialisation" en interne, cette direction sera conservée lorsque votre fonction prendra fin...

C'est ce sur quoi je comptais. C'est pourquoi j'ai misArraySetAsSeries(close,true) dans le blocOnCalculate(), qui n'est exécuté qu'une fois lors de la première connexion. Et cette "sérialisation" a bien eu lieu. Cependant, à ma grande surprise, au deuxième tic-tac, et au-delà, la "sérialité" était déjà à l'opposé.

Maxim Kuznetsov:

Avec OnCalculate, c'est un cas rare, mais dans la pratique, il arrive qu'il soit appelé par d'autres codes.

Je n'ai pas de telles exotiques et, de plus, je ne change pas la "sérialisation" des séries temporelles et des tableaux tampons à l'intérieur du programme. Par conséquent, il me suffirait de le définir une fois, au début de l'indicateur. Mais, si nous ne pouvons pas être sûrs que la "sérialité" de ces tableaux est sauvegardée, nous devons la définir au début de chaque cycle OnCalculate(). Cela semble être quelque chose de complètement anormal.

 
input string inStr = NULL; // Входная строка не может быть NULL, но об этом нигде не сообщается.

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{
  string Str = NULL;
  
  PRINT(inStr == NULL); // false
  PRINT(Str == NULL);   // true


  PRINT(inStr == ""); // true
  PRINT(Str == "");   // false
}
C'est une bonne idée de générer un avertissement au moment de la compilation.
 
fxsaber:
C'est une bonne idée de générer un avertissement au moment de la compilation.

Si rien n'a changé depuis l'époque, NULL != "" Beaucoup de gens se sont déjà fait avoir.

 
Alexey Viktorov:

Si rien n'a changé depuis l'époque, NULL != "" Beaucoup de gens se sont déjà fait avoir.

Ce n'est pas de ça qu'il s'agit.

 
fxsaber:

Nous parlons d'autre chose.

Alors explique pourquoi ce n'est pas possible. Pourquoi

input string inStr = "";

peut l'être, mais

input string inStr = NULL;

ce n'est pas possible.

 
Alexey Viktorov:

Alors explique pourquoi ce n'est pas possible.

Le script ci-dessus le montre.

 
fxsaber:

Le script ci-dessus le montre.

Si c'était le cas, il n'y aurait pas de questions. Vous pensez toujours que tout le monde autour de vous devrait lire dans vos pensées, ou être mieux formé que vous en programmation.

 
Alexey Viktorov:

Si c'était le cas, il n'y aurait pas de questions. Tu penses toujours que tout le monde devrait lire dans tes pensées, ou être plus doué en programmation que toi.

Je ne comprends pas les raisons de cette réaction. Le code laconique démontre la fonctionnalité à 100%.

 
fxsaber:

Je ne comprends pas les raisons de cette réaction. Le code laconique démontre la fonctionnalité à 100%.

Réaction normale. Je ne comprends pas vos codes, j'ai demandé une explication, et la réponse est...

NULL est une ambiguïté telle qu'il faut la traiter avec précaution. Surtout lorsqu'il s'agit de variables de type chaîne.

Extrait de la documentation

//--- если строка не инициализирована, то присвоим ей наше предопределенное значение 
if(some_string==NULL) some_string="empty";

Ainsi, dans cet exemple, NULL ne signifie pas que la longueur de la chaîne est égale à zéro, mais que la variable n'est pas initialisée.

Dans votre exemple

input string inStr = NULL;

la variable est initialisée. La façon dont il est initialisé n'est pas claire pour moi et je n'ai pas envie de faire le tri.

En conséquence,

PRINT(inStr == NULL); // false

Indique que la variable est initialisée. Encore une fois, avec quoi est la grande question. Pourquoi pensez-vous qu'il est impossible d'initialiser une variable par NULL ?

Apparemment, cette initialisation fait en sorte que la longueur de la chaîne soit égale à zéro, ce qui correspond à ce que dit ce contrôle sur

PRINT(inStr == ""); // true