Erros, bugs, perguntas - página 710

 

Necessário para determinar o tamanho de uma matriz variável, mas o erro é revelado:

void OnStart()
  {
   int j=1000;
//---
   double arrBalancesTS[][j];
  }

//---

//---

Funciona directamente com constantes (#define) e com um valor numérico, mas não como este. Porquê?

 
tol64:

Necessário para determinar o tamanho de uma matriz variável, mas o erro é revelado:

//---

//---

Funciona directamente com constantes (#define) e com um valor numérico, mas não como este. Porquê?

Com constantes, é uma matriz estática, e com uma variável, é dinâmica. E o tamanho de um dinâmico é determinado pelo ArrayResize
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 

tol64:

Porquê?

A segunda e subsequentes dimensões têm um tamanho fixo. Só pode ser definido por uma constante.
 
tol64:

Com constantes (#define) e com um valor numérico, funciona directamente, mas não desta forma. Porquê?

Porque ao definir com #define, o compilador simplesmente substitui a macro encontrada com a entrada correcta antes da compilação. Por conseguinte, vê

void OnStart()
  {
//---
   double arrBalancesTS[][1000];
  }

que não contradiga a linguagem MQL5.

 
Yedelkin:

OK. Então, vou tomar a coragem. Assim, a descrição da função Print() diz que "os dados do tipo duplo são impressos com a precisão de 16 dígitos decimais após o ponto". De facto, verifica-se que a função Print() produz dados de certa forma arredondados:

ND 0 victorg2 (EURUSD,M1) 11:04:42 Print(b)=200.0
MP 0 victorg2 (EURUSD,M1) 11:04:42 Print(DoubleToString(b,16))=199.999999999999999716

A questão é que um número real é armazenado na memória com não mais do que 17 dígitos significativos.

Experimente este exemplo para sentir a diferença:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double a,b;

   a=7.0/200.0;
   b=7.0/a;
   Print("Print(b)=",b);
   Print("Print(DoubleToString(b,16))=",DoubleToString(b,16));

   Print("Print(StringFormat(b,%.15G))=",StringFormat("%.15G",b));
   Print("Print(StringFormat(b,%.16G))=",StringFormat("%.16G",b));
   Print("Print(StringFormat(b,%.17G))=",StringFormat("%.17G",b));
   Print("Print(StringFormat(b,%.18G))=",StringFormat("%.18G",b));
   
//19999999999999997
   Print("Print(StringFormat(b,%.15f))=",StringFormat("%.15f",b));
   Print("Print(StringFormat(b,%.16f))=",StringFormat("%.16f",b));
   Print("Print(StringFormat(b,%.17f))=",StringFormat("%.17f",b));
   
  }
//+------------------------------------------------------------------+
A descrição na ajuda será corrigida.
 
notused:
Com constantes, é uma matriz estática, e com uma variável, é dinâmica. E o tamanho de um dinâmico é determinado usando o ArrayResize.
TheXpert:
A segunda e subsequentes dimensões têm um tamanho fixo. Só pode ser definido por uma constante.
Rosh:

Porque quando definido com #define, o compilador simplesmente substitui a macro encontrada com a entrada correcta antes da compilação. Por conseguinte, vê

que não contradiga a linguagem MQL5.

Obrigado. Pode dizer-me, o que pode ser feito, se o tamanho de uma matriz na primeira e segunda dimensão for definido nos cálculos e não puder ser uma constante? Com ArrayResize(), só se pode redimensionar a primeira dimensão, afinal de contas. E porque posso redimensionar um array aplicando um valor variável, enquanto que este não pode ser definido inicialmente?
 
tol64:
Obrigado. Pode dizer-me o que pode ser feito se o tamanho de uma matriz tanto na primeira como na segunda dimensão for determinado por cálculos e não puder ser uma constante? Com ArrayResize(), só se pode alterar o tamanho da primeira dimensão. E porque é que se pode redimensionar uma matriz usando uma variável, enquanto não pode ser definida inicialmente?
por favor, use aulas.
 
tol64:
Obrigado. Pode dizer-me o que pode ser feito se o tamanho de uma matriz tanto na primeira como na segunda dimensão for determinado por cálculos e não puder ser uma constante? Com ArrayResize(), só se pode alterar o tamanho da primeira dimensão. E porque posso redimensionar um array aplicando um valor variável, enquanto que este não pode ser definido inicialmente?
Veja a secção de operações de sobrecarga para um exemplo da classe CMatrix, talvez isto funcione para si.
 
Olá.

Não consigo encontrar como fazer 2 turmas trocarem mensagens.

Quero que a classe A tenha uma ligação com B e a classe B com A.
Recebi um erro de compilação, talvez a MQL5 não o permita. Mas sem ela a programação de objectos é utilizada a 30%.

A solução poderia ser escrever uma grande Aula de DEUS que saiba e saiba tudo. Mas isto não me parece muito elegante.
Quem pode ajudar com a solução?

Obrigado de antemão!
Razão: