Erros, bugs, perguntas - página 2745

 
fxsaber:

Pergunta de optimização. No testador, em cada carrapato preciso de receber um carrapato para continuar o trabalho. Faço-o desta forma.

É evidente que esta variante será mais lenta:

Mas o SymbolInfoTick também é mais lento porque o seu parâmetro de cordas não é passado por referência.

É possível ter um SymbolInfo* regular de sobrecarga onde o fio é passado por referência?

É melhor ter

No Optimizer, estas funções são chamadas dezenas de milhares de milhões de vezes.

Calling Symbol() expande-se SEMPRE para aceder à variável global _Symbol, bem como Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

 
Ilyas:

A chamada Symbol() desdobra-se SEMPRE para aceder à variável global _Symbol, tal como os Dígitos(), Ponto(), Período(), GetLastError(), IsStopped(), UninitializeReason()

E a passagem de cordel por referência?

 
fxsaber:

E passar um fio por referência?

Aparentemente, a razão é um dos problemas insolúveis no MQL - passando um literal como parâmetro pela constante ref.

 
fxsaber:

É possível ter regularmente SymbolInfo* overloads, onde o fio é passado por referência?

Como é que eles ajudariam?

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

Ainda devolve 1, não 2

 
fxsaber:

E passar um fio por referência?

O fio é passado por referência.

Há muito que nos movemos para "copy_on_write string" -> quando a cópia de uma string para outro conteúdo não é copiada imediatamente (como era antes), a contagem de referência do buffer de string é aumentada
Por exemplo, a contagem de referência é aumentada ao passar a string por valor, como parâmetro e diminuída após a chamada.
Quando

uma cadeia de caracteres é alterada, a contagem de referência do buffer é verificada e se houver mais do que uma referência, a cadeia de caracteres a ser alterada é "desvinculada" do buffer antigo e é atribuída uma nova

 
A100:

Como é que eles vão ajudar?

Ainda retorna (chamado) 1, e não 2

A variável _Símbolo é constante
 
Ilyas:
A variável _Símbolo é constante

Então a sobrecarga também não vai ajudar.

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

haverá um erro já no momento da compilação

 
Ilyas:

O fio é passado por referência.

Há muito que nos movemos para "copy_on_write string" -> ao copiar uma string para outra o conteúdo não é copiado imediatamente (como era antes), o número de referências ao buffer da string é aumentado
Por exemplo, o número de referências é aumentado quando a string é passada por valor, como parâmetro e diminuído após a chamada.
Quando

uma cadeia de caracteres é alterada, a contagem de referência do buffer é verificada e se houver mais do que uma referência, a cadeia de caracteres alterada é "desvinculada" do buffer antigo e é-lhe atribuída uma nova

Será tudo isto definido a nível de compilação?

 

Erro de compilação:

class CArray
{  
};

int ArraySize(const CArray&);


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

Será tudo isto definido a nível de compilação?

Não. Ainda não é conhecido no momento da compilação.