Erreurs, bugs, questions - page 1837

 
taille de l'insecte
void f( uchar &Array[] )
{
  Print(sizeof(Array));
}

void OnStart( void )
{
  uchar Bytes[1];
  
  Print(sizeof(Bytes));
  
  f(Bytes);
}

Résultat
1
52
 

Lors des tests, le journal n'indique pas l'heure à laquelle la commande expire :

2017.03.30 22:12:30.271 Core 1 2017.01.18 16:55:00 buy limit 0.01 EURUSD à 1.06789 (1.06879 / 1.06889 / 1.06889)<br / translate="no">2017.03.30 22:12:30.271 Core 1 ordre expiré [#4 limite d'achat 0,01 EURUSD à 1,06789].

J'aimerais que ce soit comme ça :

2017.03.30 22:12:30.271 Core 1 2017.01.18 17:25:00 ordre expiré [#4 limite d'achat 0.01 EURUSD à 1.06789].

 
fxsaber:
taille de l'insecte
Résultat

Un tableau local de 1 octet est devenu un objet tableau universel lorsqu'il est passé en paramètre. Le pointeur du tampon objet est en fait associé au tableau local. mais il ne peut pas être redistribué.

La fonction f peut prendre n'importe quel tableau en entrée, y compris un tableau dynamique.

 
Slawa:

Un tableau local de 1 octet est devenu un objet tableau universel lorsqu'il est passé en paramètre. Son pointeur de tampon est en fait associé au tableau local. mais il ne peut pas être redistribué.

La fonction f peut entrer n'importe quel tableau, y compris les tableaux dynamiques.

Il s'agit d'une explication très intéressante de l'architecture interne. Mais à cause de cela, sizeof produit un résultat tout à fait différent de celui que vous attendez lorsque vous codez.

C'est-à-dire qu'il y a une certaine incohérence dans la documentation et il devient difficile de coder sans vérifier à chaque fois.


De plus, si sizeof est appelé après la sortie de la fonction, la taille est déterminée sans être affectée par ces nuances.

 

L'option de synchronisation des positions sans avertissement ne fonctionne pas et l'exécution dans les spreads ne fonctionne pas non plus,
Il s'ouvre au pire prix et ne peut être ajusté, et ainsi de suite sur tous les terminaux. Tous les postes sont ouverts.

Qu'est-ce qu'il faut attendre quand le fournisseur ferme tous les trades plus !

 
fxsaber:

Il s'agit d'une explication très intéressante de l'architecture interne. Mais à cause de cela, sizeof produit un résultat complètement différent de celui que vous avez prévu lorsque vous codez.

C'est-à-dire qu'il y a une certaine incohérence dans la documentation et qu'il devient difficile de coder sans contrôles à chaque fois.


De plus, si vous appelez sizeof après avoir quitté une fonction, la taille est déterminée sans être affectée par ces nuances.

Avez-vous lu attentivement la documentation sur sizeof?

L'opération consistant à prendre la taille d'un type de données ou la taille d'un objet de tout type de données ( sizeof )

A l'aide de l'opération sizeof, il est possible de déterminer la taille de la mémoire qui correspond à un identifiant ou à un type. L'opération sizeof a le format suivant :

Exemple :

sizeof(expression).

Tout identifiant ou nom de type entre parenthèses peut être utilisé comme expression. Notez qu'un nom de type void ne peut pas être utilisé, et qu'un identifiant ne peut pas faire référence à un champ binaire ou être un nom de fonction.

Si un tableau statique est spécifié comme nom d'expression (c'est-à-dire que la première dimension est spécifiée), le résultat est la taille du tableau entier (c'est-à-dire le produit du nombre d'éléments par la longueur du type). Si le nom d'un tableau dynamique est spécifié comme une expression (la première dimension n'est pas spécifiée), le résultat est la taille de l'objet tableau dynamique.

Lorsque sizeof est appliqué à un nom de type de structure ou de classe ou à un identifiant qui possède un type de structure ou de classe, le résultat est la taille réelle de la structure ou de la classe.

PS : il existe des moyens plus directs de connaître la taille d'un tableau.

 
Slawa:

Si un nom de tableau statique est spécifié en tant qu'expression (c'est-à-dire que la première dimension est spécifiée), le résultat est la taille du tableau entier (c'est-à-dire le produit du nombre d'éléments par la longueur du type).

J'ai laissé de côté de la citation seulement la partie qui fait référence au code ci-dessus. Il s'agit d'un tableau statique, et le produit des deux nombres que vous mentionnez devrait être égal à un.

Si après avoir passé le tableau de statique devient dynamique et au retour il redevient statique, alors comment passer le tableau sous forme statique ?

PS : il existe des moyens plus directs de connaître la taille du tableau.

sizeof est bon en raison de son universalité - applicable aux types courants et aux tableaux également. Et ArraySize ne s'applique qu'aux tableaux.
 
fxsaber:

De la citation, je n'ai laissé que le morceau qui fait référence au code ci-dessus. C'est un tableau statique, et le produit de deux nombres que vous avez mentionné devrait être un.


Encore une fois. Là où il y a un tableau statique, il en affiche un.

Les paramètres de la fonction n'ont jamais été des tableaux statiques. Il y a un objet d'un tableau inconnu au préalable. Dynamique, statique, séries chronologiques, indicateur tampon

En quoi "l'universalité de sizeof" vous aide-t-elle ? Il ne s'agit pas de C ou C++ avec accès direct à la mémoire. Et il faut être prudent lors de l'interprétation des résultats de taille. Allouer un tableau dynamique à 1000 éléments et demander sizeof. Je parle spécifiquement du C++. Vous semblez être surpris du résultat.

Et vous n'avez pas entendu parler de _countof_ ?

 
Slawa:

Encore une fois. Là où il y a un tableau statique, il en affiche un.

Les paramètres des fonctions n'ont jamais été des tableaux statiques. Il y a un objet d'un tableau inconnu au préalable. Dynamique, statique, série chronologique, tampon indicateur.

En quoi "l'universalité de sizeof" vous aide-t-elle ? Il ne s'agit pas de C ou C++ avec accès direct à la mémoire. Et il faut être prudent lors de l'interprétation des résultats de taille. Allouer un tableau dynamique à 1000 éléments et demander sizeof. Je parle spécifiquement du C++. Vous semblez être surpris du résultat.

Et vous n'avez pas entendu parler de _countof_ ?

Je ne connais que très peu le MQL. Je ne connais pas SI, c'est pour ça que je n'ai pas entendu.

void OnStart( void )
{
  uchar Bytes[];
  
  ArrayResize(Bytes, 100);
  
  Print(sizeof(Bytes));
}

Le résultat est de 52. C'est bon ? Je n'ai pas à me plaindre de l'architecture interne. Je veux juste m'assurer que mes perceptions pendant le codage ne sont pas erronées. Les idées sont formées sur la base d'une lecture attentive de la documentation et des scripts de test pour détecter les ambiguïtés.


Dans ce cas, j'ai rencontré un comportement étrange dans un grand code. Et après une longue recherche, j'ai trouvé une nuance décrite par vous, qui n'est probablement évidente pour personne sur ce forum. Et avec l'exemple ci-dessus, il s'avère que vous ne pouvez pas du tout faire sizeof pour les tableaux dynamiques (le résultat est toujours 52).

 

C'est normal et tout à fait correct. Vous avez demandé la taille interne (sans charge utile) d'un objet dynamique.

Utilisez ArraySize pour les objets dynamiques et appliquez sizeof aux objets statiques uniquement. Sizeof est compté au moment de la compilation et est toujours une constante.

Raison: