Erros, bugs, perguntas - página 1356

 
Vasiliy Sokolov:
Muito fresco e, o mais importante, ideologicamente correcto. Duas mãos a favor!
Então seria ideologicamente correcto
class A { public:
        bool operator !=( A* ) {}
        bool operator  <( A* ) {}
};
void f()
{
    A *a1, *a2;
    a1 != a2; //здесь простое сравнение указателей вместо вызова operator !=()
    a1 <  a2; //здесь вызывается operator <()
}
operator!=() seria chamado em vez de comparar apontadores com a igualdade como é agora. E a comparação de ponteiro poderia ser realizada por uma função especial semelhante a ::GetPointer(...)

Mas isto não é feito pela simples razão de que traria inconvenientes significativos, e a vantagem seria apenas a correcção ideológica

 
Há algum tempo que não recebo uma actualização: MetaTrader5 build 1159 (ligado ao MetaQuotes-Demo). Comando de compilação de cargas de construção 1162
 
Vasiliy Sokolov:

Depois, o cordel é também um conjunto de números específicos. E uma imagem é também um número e um pulso eléctrico num chip.

Em geral, estudar engenharia eléctrica, colega.

Aqui está uma comparação de apontadores em C++ e descritores em MQL/C# e algumas outras línguas.

O desafio - quer conversar ao vivo com um companheiro.

1. Apontadores. Conhecemos a rua, o número da casa e o apartamento. Vamos ao endereço, acordamos o amigo, pegamos numa bolha, ele está excitado e a conversar )))

2. Descritores. Não sabemos o endereço exacto, ninguém está autorizado a entrar na casa, por exemplo, é o edifício FSB. Há um posto de controlo na casa, que se recusa a dizer o endereço pelo nome de um amigo (por descritor), se recusa a deixar entrar na casa (no espaço de endereços). A segurança chama o companheiro e pede-lhe que saia. Ele sai, vocês alegremente puxam a bolha, ele assobia, - o que é que vocês!!!! guardam-na imediatamente!!! Lá se vai a caminhada...Caminhando para casa com uma garrafa por abrir na mão, apercebe-se com grito que os descritores proporcionam segurança em troca de capacidades de sinalização.

 
Vasiliy Sokolov:

Em geral, estudar engenharia eléctrica, colega.

Nenhum outro argumento?
 
A100:
Nenhum outro argumento?
E quanto a si?
 
A100:
Tenho trechos de código onde os apontadores são explicitamente convertidos em números (para interface com sistemas externos de escrita/leitura, bem como para análise e depuração de erros), se isto for proibido, então a flexibilidade será reduzida e teremos de refazer.
Argumento interessante, leva algum tempo a pensar no assunto. Por favor, crie um pedido, discuti-lo-emos em pormenor.
 

A propósito, que tal introduzir * e & operadores em MQL para permitir o acesso explícito a um objecto no primeiro caso, e levar um ponteiro de objecto no segundo (em vez do pesado GetPointer). O asterisco é uma obrigação, e não há nada na língua que o substitua.Sem ele, é impossível controlar situações como a descrita por A100 acima, quando em vez dos próprios objectos são executadas algumas acções de ponteiro. Pessoalmente, este é um problema constante, tenho de estar constantemente alerta ou especificar A.operator=(B), A.operator!=(B) em todo o lado, ou seja, perde-se a brevidade, e os operadores de sobrecarga tornam-se de facto inúteis.

Já levantei este problema uma vez, mas o assunto ficou parado. Vamos finalmente terminar esta questão.

 

Pergunta sobre variáveis externas.

Enfrentei uma situação em que a variável externa muda durante a execução do programa, mas quando o período de tempo é alterado, volta a tomar o valor definido na janela de propriedades. Por exemplo, se antes do início eu definir TradeEnable para EnableAll e alterar o valor para EnableBuy durante a execução do programa, então quando o gráfico mudar para outro período de tempo o valor voltará para EnableAll. O valor que defino no evento do temporizador e saída através de Comentário, não pode haver erro.

enum ETradeEnable {EnableAll, EnableBuy, EnableSell, DisableAll};
extern ETradeEnable TradeEnable = EnableAll;

A variável TradeEnable não é afectada pela inversão dos gráficos. Ler o manual - Ao contrário das variáveis de entrada, os valores das variáveis externas podem ser alterados programmaticamente enquanto o programa está em execução.

É assim que o OnDeinit e o OnInit são criados.

Pergunta: Eu não entendo algo ou mudança de TradeEnable é um erro de tempo de execução?

int LastDeinitReason = 0;

void OnDeinit(const int reason)
{
    LastDeinitReason = reason;
    if(reason==REASON_CHARTCHANGE || reason==REASON_TEMPLATE || reason==REASON_PARAMETERS)
        return;
    EventKillTimer();
// далее код при завершении работы советника
}

int OnInit()
{
    if(LastDeinitReason==REASON_CHARTCHANGE || LastDeinitReason==REASON_TEMPLATE)
    {
        LastDeinitReason = 0;
        return(INIT_SUCCEEDED);
    }
    if(LastDeinitReason==REASON_PARAMETERS)
    {
        SetParams();
        return(INIT_SUCCEEDED);                              
    }
// далее код инициализации при запуске
}
 
Alexey Navoykov:

Vamos finalmente terminar esta edição.

Dois operadores são aí sacrificados (== e !=) a fim de preservar todos os outros.

Vejo uma saída num padrão.

template<typename T1, typename T2>
bool IsEqualPointer( const T1 *t1, const T2 *t2 )
{
    return ( ulong(t1) == ulong(t2) );
}

Se operator===(!=) estiver definido, será chamado. Se não estiver definido, as indicações serão comparadas com a igualdade. E se operador==(!=) estiver definido e as indicações devem ser comparadas entre si em matéria de igualdade, isto pode ser feito através do modelo especificado.

As alterações ao sistema existente são mínimas e o principal é que não afectarão aqueles que simplesmente comparam as indicações com a igualdade sem sobrecarga de operador==(!=).

 
A100:

Dois operadores são aí sacrificados (== e !=) a fim de preservar todos os outros.

Vejo uma saída num padrão.

Se operator===(!=) estiver definido, será chamado. Se não estiver definido, as indicações serão comparadas com a igualdade. E se operador==(!=) estiver definido e as indicações devem ser comparadas entre si em matéria de igualdade, isto pode ser feito através do modelo especificado.

As mudanças no sistema existente são mínimas e o principal é que não afectarão aqueles que simplesmente comparam apontadores sem operador==(!=) sobrecarga.

Claro que pode fazer comparações e atribuições através de funções separadas, mas qual é o objectivo? O objectivo é convencer os criadores a fazer uma solução adequada.