Erros, bugs, perguntas - página 713

 
speedy:

O botão Compile perde-se para sempre (é necessário voltar a carregar o editor para o recuperar)

Bem, não exactamente... :) Consegui recuperá-lo :)

Tem de comentar a peça recursiva e premir o botão de compilação de depuração para o fazer.

 
speedy:

1. não é seguro "expor" elementos internos não pertencentes à classe base ao exterior (e neste exemplo, não o atributo em si, mas apenas um elemento de matriz!) Além disso, não é possível alterar o seu valor.

Além disso, contradiz o "espírito" da programação orientada para o objecto: todo o trabalho com os dados do objecto deve ser realizado dentro do objecto, pelos seus próprios métodos...

3. que tal utilizar apenas Setter para atributo de dados?

4. o código beneficiaria da legibilidade.

5. eventualmente esta "simplicidade" com indexador de valor l não fará ninguém, incluindo você, compreender como funciona este código...

6. passará mais tempo à procura de erros do que a escrever Setter.

O que é isso, humor negro?

1. desculpem, - disparate. compreendo que a paranóia está em voga aqui, e é um argumento de refugo para "porque é que não o devem fazer". não vejo qualquer perigo nisso. Olhado cuidadosamente, se é que há alguma coisa, qualquer nome, afinal, é uma referência. A indexação é apenas uma extensão do conceito do nome. Nada mais. Vamos proibir completamente a nomeação. Por razões de segurança. Os links são extremamente perigosos, não são?

2. essa lógica contradiz violentamente o espírito da programação orientada aos objectos com C++, C#, Delphi e algumas dezenas de linguagens menos populares onde os indexadores funcionam bastante bem tanto à direita como à esquerda. Além disso, não contradiz o senso comum e o meu espírito por qualquer razão.

Os indexadores são feitos para comunicar com o ambiente externo. A sua função é exactamente a de uma interface. Posso encapsular e esconder qualquer coisa, mas preciso de índices para operar com objectos como matrizes. Na realidade, todas as matrizes estão dispostas de alguma forma. Por exemplo, arrays mql dinâmicos regulares. Podemos proibir a sua colocação no lado esquerdo do operador de atribuição? Vamos substituí-los por uma função como SetArrayValue(array, i, j, valor); isto irá simultaneamente melhorar a legibilidade. E a depuração também se tornará muito mais fácil. Ugh....

3. que tal fazer um indexador normal? a empregada é fixe, claro, mas a rainha ainda é melhor.

4. é aqui que estou realmente a começar a perder o juízo. Será isso ilegível?

  t[i]=i*i;

Isto é mais legível, não é?

  t.setDataElement(i, i*i);

Fixe, acho que vou receber tratamento.

5. frio.

6. Eu chorei.


 

O indicador deixou de se compilar no build 630:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
 //код
 for(int i=limit; i<rates_total && !IsStopped(); i++)
  {
   if()
    {
     //~400 стр. кода
     // i используется много раз
     // тут же определяется RT=true или false
    }
   if(RT)
    {
     double p=close[i];  // 'i' - undeclared identifier
    }
  }
 return(rates_total);  // 'rates_total' - undeclared identifier
}

c i erro pode ser eliminado colocando um anúncio em frente de

int i;
for(i=limit; i<rates_total && !IsStopped(); i++)
{

}

E o que fazer com'rates_total' - identificador não declarado ?

O mesmo em Win7 x64 e XP x32.

 

Pode dizer-me, por favor? Será que MathMin() e MathMax() são implementadas como funções (comparâmetros passados através de pilha) ou substituição macro(em linha)? Segundo o livro de referência, são funções.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
kPVT:

O indicador deixou de se compilar no build 630:

c i erro pode ser eliminado colocando um anúncio em frente de

E o que fazer com'rates_total' - identificador não declarado ?

O mesmo em Win7 x64 e XP x32.

Deve haver um erro no seu código algures. O bloco que submeteu compila sem erros se declarar as variáveis limite, RT e condição se()
 
Rosh:
Tem claramente um erro algures no seu código. O bloco submetido compila sem erros se declarar as variáveis limite, RT e definir condição se()

Naturalmente, eu não dei o código, mas uma estrutura aproximada.

Sobre o 619 construir o indicador compilado e funcionou bem.

Em 630 gera os erros acima mencionados.

O código é 100% inalterado. A forma como o compilador funciona mudou obviamente.

 
Por favor,escreva para o Service Desk e anexe o código fonte. Isto ajudará os criadores a encontrar a causa e a corrigi-la.
 
speedy:

Bug?

O código abaixo gera uma espécie de loop perpétuo no compilador. Clicando em Cancelar

não funciona imediatamente, mas quando funciona, recupera o controlo do editor.

O botão Cancelar em si não desaparece, mas também não é acessível.

O botão Compile perde-se para sempre (é necessário voltar a carregar o editor para o recuperar)

Obrigado pelo correio, o erro do compilador foi corrigido.
 
victorg:

Por favor, aconselhar. Será que MathMin() e MathMax() são realizadas como funções (comparâmetros passados através da pilha) ou como macrossubstituições(em linha)? De acordo com o livro de referência, elas são funções.

Claro que funciona, porque no momento da compilação os valores dos argumentos são desconhecidos. IMHO em linha e macros são diferentes.

P.S: em linha ou não em linha, não posso dizer.

 
220Volt:

Claro que funciona, porque no momento da compilação os valores dos argumentos são desconhecidos. IMHO em linha e macros são diferentes.

P.S: se estão em linha ou não, não posso dizer.

Uma função macro e em linha são de facto coisas diferentes. Mas não é isso que eu quero dizer. Eis um exemplo quando, no momento da compilação, os valores dos argumentos são desconhecidos

#define  min(a,b) (((a)<(b))?(a):(b))
double func(a,b)
  {
  c=min(a,b);   // 1-й вариант
  c=fmin(a,b);  // 2-й вариант
  return(c);
  }

No primeiro caso, o código deve ser colado na função actual (penso eu) e no segundo caso, a função é chamada com parâmetros passados através da pilha (penso eu). Mas para efeitos de optimização, o compilador pode de facto implementar a segunda variante também através de substituição. É assim? Não sei. Foi por isso que perguntei.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5