Erros, bugs, perguntas - página 2722

 
A100:

Em princípio, não deveria existir tal caso - a questão deveria ter sido resolvida a nível do compilador (como em C++). E neste caso é meio possível e como consequência, a discussão em várias páginas

Definitivamente um insecto... Mas tem de ser! )))

imho, as expressões constantes devem ser conhecidas no momento da compilação e as expressões estáticas devem ser conhecidas durante a inicialização da aplicação na sequência de descrição.

e este esquema em MQL, onde há uma espécie de controlo constante, mas posso atribuir constantes em tempo de execução, e posso usar uma chamada de função como uma inicialização, como esta

struct A
{
   const double a;
   A():a(AccountInfoDouble(ACCOUNT_BALANCE))
   {
      Print("a = ", a); // a = 9999.290000000001
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   A a1;
}
//+------------------------------------------------------------------+

e esta "constante" pode estar na visibilidade local.... em que momento se torna uma expressão constante e como é que ajuda.... não sei, não o entendo sem manuais, não há descrição do modelo de memória - não há nenhum ponto nele, bem, no máximo, usar como deve ser - inicializar com constante em todos os construtores, então o compilador ajudará a avisar se você acidentalmente decidir modificar este campo no futuro

 
Igor Makanu:
Mas este esquema em MQL, onde existe uma espécie de controlo sobre constantes, mas eu próprio posso atribuir constantes em modo aleatório

Quantas vezes se pode envergonhar com a ignorância básica dos princípios básicos de C++?

 

este exemplo é de todo confuso:

struct A
{
   const double a;
   A():a(SymbolInfoDouble(_Symbol,SYMBOL_ASK))
   {
      Print("a = ", a);
   }
};
void OnTick()
  {
   const A a;
  }
//+------------------------------------------------------------------+

2020.04.23 21:40:04.474 tst (EURUSD,H1) a = 1.07892

2020.04.23 21:40:04.546 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:04.585 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.254 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.305 tst (EURUSD,H1) a = 1.07893

2020.04.23 21:40:05.306 tst (EURUSD,H1) a = 1.07892

 
Stanislav Korotky :

Há dois programas a trabalhar no mesmo ficheiro ao mesmo tempo. A que escreve utiliza as bandeiras FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. A que lê - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Embora o primeiro programa salve periodicamente o ficheiro com FileFlush, o segundo programa só vê o comprimento do ficheiro quando este é aberto. Tentei fazer FileSeek para a frente e para trás - não ajuda.

Pergunta: como faço para que o programa que lê o ficheiro recolha os dados que estão a ser reescritos?

Isto parece ser um bug, foi relatado há algum tempo no fórum inglês. Não tive tempo de o relatar aqui.

Os programadores não lêem o fórum inglês?

 
Stanislav Korotky:

Há dois programas a trabalhar no mesmo ficheiro ao mesmo tempo. A que escreve utiliza as bandeirasFILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ. A que diz - FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ. Embora o primeiro programa salve periodicamente o ficheiro com FileFlush, o segundo programa só vê o comprimento do ficheiro quando este é aberto. Tentei fazer FileSeek para a frente e para trás - não ajuda.

Pergunta: como faço para que o programa que lê o ficheiro apanhe os dados a serem sobregravados?

Os dois programas estão no mesmo terminal ou em dois diferentes?

 

Os métodos de objectos de uma matriz de objectos passados por referência não funcionam.

Exemplo:

//+------------------------------------------------------------------+
//| Пример: добавленный метод для расширения файла ..\Include\String\String.mqh
//|--
//| Получает из указанной строки подстроки по заданному разделителю 
//| и возвращает количество полученных объектов-подстрок
//|         НЕ РАБОТАЕТ !!!!!!!!!!
//+------------------------------------------------------------------+
int CString::Split(const string separator,      // разделитель
                   CString      &result[] )     // массив строковых объектов
  {
   string tmp_result[];               

   if(StringLen(separator)==0) return(0);

   ushort u_sep=StringGetCharacter(separator,0); 
   
   int count=StringSplit(m_string,u_sep,tmp_result);

   // временно для проверки
   result[0].Assign("Buy"); // НЕ РАБОТАЕТ !!!!!!
   Alert("ressult[0] = ",result[0].Str()); // <--- уже не отрабатывает
   // конец временно
   
   /*
   for(int i=0;i<count;i++)
     {
      result[i].Assign(tmp_result[i]); // НЕ РАБОТАЕТ !!!!!
     };
   */
   
   return(count);
  }
//+------------------------------------------------------------------+
 
Slava:

Será que estes dois programas estão no mesmo terminal ou em dois diferentes?

Num terminal. O perito escreve os dados, o indicador lê os dados. Pendurado em gráficos diferentes, mas obviamente poderia estar no mesmo (se isso importar). Construir 2380.

 

VS2019

#include <iostream>

int x;

struct A 
{
    const int a;
    A() :a(x) {}
};
int main()
{
    std::cout << "x = ";
    std::cin >> x;
    const A a;
    std::cout << "a.a = " << a.a;
}

x = 12345

a.a = 12345

hmm, tudo funciona como na MQL5

OK, retiro o que disse, não se compila em Sharp

 
Vict:

Bem, também tem um construtor. Depende de si, claro, mas as estruturas são entidades C, o modelo lá é diferente - entidades passivas com lógica externa (funções).

Não necessariamente. Porquê C? E quanto a C#? - Todas as conversas sobre estruturas passivas são noções arcaicas, imho. Creio que pelo menos todos os tipos devem ter um construtor. Os campos não inicializados são maus e devem ser evitados.

No seu caso, precisa de fazer um método de fábrica para criar um conjunto de estruturas, ou seja, algo como isto:

struct A
{
  const int a;
  A(int init_value) : a(init_value) { }

  static bool CreateArray(A &array[], int count, int init_value)
  {
    //...
  }
};

E já existe uma das formas anteriormente sugeridas para preencher os elementos da matriz.

 

Deparei-me com o seguinte problema. O indicador desenha velas

Está traçado na tabela. Há também um Consultor Especialista que lê buffers do indicador

Assim, registei e folheei as etapas e descobri que o indicador desenha frequentemente velas com um atraso.

Significa que há vários tiquetaques atrás (até alguns minutos exactamente) já calculou e actualizou os amortecedores e o Conselheiro Especialista está a ler dados dos mesmos

(tanto as corujas como o indicador escrevem-no no registo). Mas vemos a velha imagem na tabela. Por exemplo, a captura de ecrã foi feita no momento em que a barra vermelha rompeu o ponto mais baixo da barra anterior. Mas no gráfico vemos apenas o vermelho anterior e o verde subtraído (de facto, é maior por duas barras).


E aqui está o quadro real, foi desenhado mais tarde. Vemos a avaria, iniciou a captura da imagem do ecrã. De acordo com os registos, tudo é claro.



Quem me dirá qual é o problema e como acelerar a actualização dos gráficos? Chamo à funçãoChartRedraw da EA, mas ainda tem um atraso de alguns minutos.

Dois minutos é um pouco demais, não consigo sequer imaginar a razão. Os cálculos não são tão cósmicos para abrandar tanto.