Erreurs, bugs, questions - page 2745

 
Ilyas:

L'appel Symbol() se déroule TOUJOURS pour accéder à la variable globale _Symbol, tout comme Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

Et le passage de la chaîne par référence ?

 
fxsaber:

Et passer une chaîne par référence ?

Apparemment, la raison est l'un des problèmes insolubles de MQL - passer un littéral comme paramètre par const ref.

 
fxsaber:

Est-il possible d'avoir des surcharges SymbolInfo* normales, où la chaîne est passée par référence ?

Comment pourraient-ils aider ?

int SymbolInfoTick( string  symbol ) { return 1; }
int SymbolInfoTick( string& symbol ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol ));
}

Il renvoie toujours 1, et non 2

 
fxsaber:

Et passer une chaîne par référence ?

La chaîne est passée par référence.

Nous sommes passés depuis longtemps à "copy_on_write string" -> lors de la copie d'une chaîne de caractères vers une autre, le contenu n'est pas copié immédiatement (comme c'était le cas auparavant), le nombre de références au tampon de la chaîne de caractères est augmenté
. Par exemple, le nombre de références est augmenté lors du passage de la chaîne de caractères par valeur, en tant que paramètre et est réduit après l'appel.
Lorsqu'

une chaîne est modifiée, le nombre de références au tampon est vérifié et s'il y a plus d'une référence, la chaîne à modifier est "déliée" de l'ancien tampon et un nouveau tampon est alloué.

 
A100:

Comment vont-ils aider ?

Il renvoie toujours (appelé) 1, et non 2.

La variable _Symbol est constante
 
Ilyas:
La variable _Symbol est constante

Alors la surcharge n'aidera pas non plus.

int SymbolInfoTick(       string  ) { return 1; }
int SymbolInfoTick( const string& ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol )); //Error
}

il y aura une erreur déjà au moment de la compilation

 
Ilyas:

La chaîne est passée par référence.

Nous sommes passés depuis longtemps à "copy_on_write string" -> lors de la copie d'une chaîne de caractères vers une autre, le contenu n'est pas copié immédiatement (comme c'était le cas auparavant), le nombre de références au tampon de la chaîne de caractères est augmenté
. Par exemple, le nombre de références est augmenté lors du passage d'une chaîne de caractères par valeur, en tant que paramètre et diminué après l'appel.
Lorsqu'

une chaîne est modifiée, le nombre de références au tampon est vérifié et s'il y a plus d'une référence, la chaîne modifiée est "déliée" de l'ancien tampon et un nouveau lui est alloué.

Tout cela est-il défini au niveau de la compilation ?

 

Erreur de compilation :

class CArray
{  
};

int ArraySize(const CArray&);


void Main()
{
  CArray arr;
  ArraySize(arr);  // Нормально
  
  CArray arrays[1];
  ArraySize(arrays[0]); // 'arrays' - array required
}
 
fxsaber:

Tout cela est-il défini au niveau de la compilation ?

Non. Il n'est pas encore connu au moment de la compilation.

 
Koldun Zloy:

Non. Il n'est pas encore connu au moment de la compilation.

Alors, en quoi cela permet-il d'éviter un nombre énorme de vérifications lorsque SymbolInfoTick est appelé des dizaines de milliards de fois ?

Raison: