Erros, bugs, perguntas - página 2330

 
Ilyas:

Descobri a razão. Tenho uma variável global.

CArrayObj actobjects;

Algo com a ordem de iniciação do ambiente e missão mcl aparentemente, se eu próprio fizer um ponteiro e colocar uma matriz, nada se desmorona. Aula em variáveis globais - má prática, claro, vou reescrever. Mas surgirão problemas com arrays estáticos em funções (em µl a regra - a inicialização à primeira entrada em função não funciona).

Em geral, se conta como um insecto, então conhecendo aproximadamente a causa, posso provavelmente localizá-lo.

 
pavlick_:

De qualquer modo, se conta como um insecto, conhecendo mais ou menos a causa, posso localizá-lo, suponho.

Não, não consegue apanhá-lo, desaparece miraculosamente depois de ter cortado o código. Mesmo comentando algumas linhas (que não são executadas antes do acidente) afecta-o.

 

Existe uma classe de código longo, que se situa em mqh. Precisamos de criar exactamente a mesma classe, que difere da original apenas em duas linhas (em vez de menos sinal, deveria haver mais sinal).

Isto pode ser feito sem criar outro mqh quase idêntico?


Quando a aula é curta, pode facilmente realizá-la com uma macro de várias linhas e tudo sai facilmente. Mas o código aqui é longo.

Não quero criar um mqh-clone porque se eu fixar um mqh, terei de repetir todas as minhas acções no segundo. Além disso, existe o factor humano do esquecimento e da falta de atenção.


Ainda o pode fazer com uma classe modelo. Mas não é de modo algum óbvio como irá afectar a velocidade de execução. A aula é necessária para corridas rápidas.

 
fxsaber:
#ifdef
 
TheXpert:
#ifdef

Não vai funcionar. Ambas as classes devem estar em funcionamento.

 
fxsaber:

Não vai funcionar. Ambas as classes devem estar em funcionamento.

Não vejo qualquer problema.

_____________

herança

colocar as diferenças em pequenas classes separadas

 
TheXpert:

Não vejo qualquer problema.

_____________

herança

Colocar as diferenças em pequenas classes separadas

Há vários métodos de tamanho decente numa classe. Em cada método, basta substituir o sinal ">" por um sinal "<".

Pode usar um virtual como este
class A
{
private:
  virtual bool Compare()
  {
    return(true);
  }
public:

  bool f()
  {
    return(this.Compare());
  }
};

class B : public A
{
private:
  virtual bool Compare()
  {
    return(false);
  }
};


void OnStart()
{
  A a;
  B b;
  
  Print(a.f());
  Print(b.f());
}


Mas, infelizmente, ainda precisamos de passar a classe que inicializa o valor. Por isso, acho que afinal teremos de usar um modelo.

 
fxsaber:

Passaria alguns adaptadores através de parâmetros de modelo (não deve haver travões), mas se quiser ser tão desajeitado, também pode. Fazer uma ligação dura ao ficheiro de cabeçalho (mklink /H <link> <target>, se não estou enganado. Pode pesquisar no Google "windows create hard link"). E depois activar este material da forma habitual

#define _N C1    // имя класса
#define _M "c1"  // какой-то параметр
#include <qq.mqh>
#undef _N
#undef _M
#define _N C2
#define _M "c2"
#include <ee.mqh> // жёсткая ссылка на qq.mqh
#undef _N
#undef _M
 
pavlick_:

Passaria alguns adaptadores através de parâmetros de modelo (não deve haver travões), mas se quiser ser tão desajeitado, também pode. Fazer uma ligação dura ao ficheiro de cabeçalho (mklink /H <link> <target>, se não estou enganado. Pode pesquisar no Google "windows create hard link"). E depois basta ligá-lo da forma habitual.

Não estás a perceber a questão.

 
fxsaber:

Não compreende a questão.

Bem, não sei, tem a certeza que me compreende? Só no caso de a listagem ser qq.mqh e ee.mqh (uma entidade, mudar uma muda a outra)

class _N
{
public:
   void f() {Alert(_M);}
};

Tudo como ordenado, classe não inmacros, quase o mesmo excepto _M.