Erros, bugs, perguntas - página 1440

 

MT 4. MathRand() gerador de números aleatórios dentro de OnTick(). Ao testar a coruja, obtêm-se resultados diferentes quando esta é executada novamente nas mesmas definições. Isto é natural se o número gerado afectar o algoritmo.

Ao optimizar, obtenho, por alguma razão, resultados idênticos numa segunda corrida com as mesmas configurações. Então MathRand() não funciona em modo de optimização?

 
Сергей Таболин:

Segundo (tenho medo de cometer um erro aqui, espero queAlexander Puzanov possa corrigir-me se alguma coisa), se o programador por alguma razão decidir adicionar um item com índice 20 a uma matriz dinâmica, nada de mal acontecerá. A matriz tomará esta dimensão e escreverá aí um valor e inicializará os índices "em falta" com valores zero.

Exactamente. Porquê "zero"? Talvez deva ser EMPTY_VALUE ? Ou WRONG_VALUE ?

O problema de tais atribuições implícitas é exactamente a sua natureza implícita - o compilador introduz algum código, que um programador pensa de uma forma, enquanto outro pode pensar de forma diferente.

Além disso, é ineficaz - nem sempre é necessário inicializar imediatamente uma variável, e inicializar uma grande variedade num laço pode reduzir significativamente a velocidade.

E em terceiro lugar, ninguém impede o programador de controlar a dimensionalidade e o índice utilizado! A única diferença é que agora ele é obrigado a fazê-lo! )))

Se o compilador mantém um registo da dimensão de uma matriz em si, nenhuma classe será capaz de limpar este código. A eficiência pode muito bem baixar.

Ao mesmo tempo, se o compilador não se encarregar desta tarefa, o programador pode escrever uma classe para o fazer e depois utilizar uma matriz que se expandirá e será inicializada com zeros sempre que necessário.

No segundo caso, a flexibilidade é maior.

Portanto, o que propõe é também uma boa solução para muitos casos. Mas pode diminuir a eficácia, o que não é bom.

 
Сергей Таболин:

Este é, em princípio, um exemplo simples de como uma matriz dinâmica deve ser normalmente preenchida. Já não escrevo em C há muito tempo, não me lembro, mas é assim que as matrizes são preenchidas em php! Tudo é lógico e compreensível. Se eu adicionar um elemento a um array (arr[] = x), o array é automaticamente expandido, e o elemento é adicionado ao fim do array. E não temos de o esticar sozinhos, e não temos de especificar o índice do elemento por nós próprios. Mas aqui temos de fazer movimentos absolutamente desnecessários:

a diferença é óbvia...

Na minha opinião, é estranho, para dizer o mínimo ))))

As linguagens de programação estão divididas em estritamente dactilografadas e não. O seu PHP, R e outras linguagens funcionais pertencem às linguagens não estritamente dactilografadas. Em linguagens estritamente digitadas como MQL ou C# e Java, este tipo de manipulação ambígua de dados não é permitida. E isto é feito especificamente para a segurança do próprio programador. A tipagem rigorosa implica que cada um dos seus procedimentos é extremamente específico: "tomar um elemento no índice 0 no array" é um procedimento específico e claro, mas propõe a sua substituição por "tomar algo do array e adicioná-lo ao que o compilador decidir voltar primeiro". - Concorda que não irá longe nisto.

Por outro lado, é claro que queremos construções simples de alto nível sem o cansativo dimensionamento da matriz e constante rearranjo do utilizador. É exactamente para isso que serve a biblioteca padrão. Em vez de utilizar arrays básicos, mudar para as classes do grupo Array. É assim que, por exemplo, a adição de zero a 16 no conjunto CArrayInt se parece:

#include <Arrays\ArrayInt.mqh>

void OnStart()
{
   CArrayInt array;
   for(int i = 0; i < 16; i++)
      array.Add(i);   
}

Como se pode ver, não há nada demasiado natural. E não há necessidade de rachar o cérebro sobre o tamanho actual da matriz e outros rearranjos. Tudo é feito por si, dentro de uma digitação rigorosa, e é convidado a concentrar-se directamente na tarefa do utilizador. Este é o poder e o objectivo do OOP.

 

A gravação completa não está disponível. Erro de compilação

template<typename T>
class A { protected:
        A( T t ) : t( t ) {}
        T t;
};
class B : A<int> {
        B() : A<int>( 1 ) {} //'<' - member(s) initialization expected
};
 

Não consigo encontrar onde estou errado.

A tarefa consiste em encontrar o valor máximo e mínimo num intervalo

void OnStart()

  {
int            Kol_Kan=10;       //Количество элементов для копирования
double         HI[];             //массив для хранения максимумов на интервале
double         LO[];             //массив для хранения минимумов на интервале

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумов
CopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумов

ArrayResize(HI,Kol_Kan);         //устанавливаем размер массива
ArrayResize(LO,Kol_Kan);

int in_max=0;                    //индекс максимального значения в массиве
int in_min=0;

in_max=ArrayMaximum(HI,WHOLE_ARRAY,0); //Находим индексы максимума и мин в массивах
in_min=ArrayMinimum(LO,WHOLE_ARRAY,0);

double hi_max;                   // максимальное значение цены 
double lo_min;                   // минимальное значение цены

hi_max=HI[in_max];               //Переносим значения максимумов и мин в переменные
lo_min=LO[in_min];
Alert(hi_max,"___",lo_min);   

  } 
 

Ordem errada dos argumentos em ArrayMaximum(), ArrayMinimum().

 
PabloEs:

Não consigo encontrar onde estou errado.

A tarefa consiste em encontrar o valor máximo e mínimo num intervalo

Funções

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//copy values of maxima

CopyLow(_Symbol,0,2,Kol_Kan,LO); //copy values of minima

já redimensionou a matriz.

Isto é desnecessário

ArrayResize(HI,Kol_Kan); //seture o tamanho da matriz

ArrayResize(LO,Kol_Kan);

 
Sergei Vladimirov:

Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().

Exactamente)) E aqui estava eu a pensar...

Vladimir Pastushak:

Funções

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//copy values of maxima

CopyLow(_Symbol,0,2,Kol_Kan,LO); //copy values of minima

já redimensionou a matriz.

Isto é desnecessário

ArrayResize(HI,Kol_Kan); //seture o tamanho da matriz

ArrayResize(LO,Kol_Kan);

Sabê-lo-ei, obrigado.

 
PabloEs:
Então o que é que se passa? Não consigo perceber sozinho?
 

O autor, por outro lado, já o descobriu. ))

PabloEs:

Exactamente)). E aqui estava eu a pensar...