Erros, bugs, perguntas - página 167

 

Pergunta sobre arrays dinâmicos

double open_main_array[] - variável de classe

inicialização

ArraySetAsSeries(open_main_array,true);

A 1ª chamada da função que contém o seguinte código

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

2ª chamada da função

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

O open_main_array array conterá dados copiados durante a 2ª chamada ou o array será incrementado e conterá dados da 1ª e 2ª chamadas?

Em alternativa, pode utilizar:

ArrayFree(open_main_array)

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

variável não inicializada - significa que a variável tem a garantia de ter um ramo de passagem quando não é inicializada. por exemplo, o default é explicitamente omitido no switch, no qual o MainPrice deve ser explicitamente inicializado (ou explicitamente zerado quando declarado).

Sobre o "passe garantido". Aqui está um tal pedaço de código:

            (1)         double local_low;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion=false;
            (4)         for(uint n=1;n<Ac-k;n++)
            (5)           {
            (6)            if(low[index_interior-n]<low[index_interior-n-1])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion=true;
            (10)              break;
            (11)              }
            (12)          }  
            (13)        if(interrupcion)
            (14)          {
            (15)           if(EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

Para a última linha (linha 15) diz "possível utilização da variável não-inicializada 'local_low'".

Mas devido à utilização da interrupção bool-variável na linha 9 logo após a inicialização da variável local_low na linha 8, verifica-se que na linha 15 a variável local_low terá a garantia de ser inicializada. Assim, neste ponto, o aviso "possível utilização da variável não inicializada 'local_low'" não significa "garantida", mas apenas possível presença de um ramo de passagem em que a variável não é inicializada.

 
Yedelkin:

Sobre "passagem garantida". Aqui está um pedaço de código:

Para a última linha (linha 15) diz "possível utilização da variável não-inicializada 'local_low'".

Mas devido à utilização da interrupção bool-variável na linha 9 logo após a inicialização da variável local_low na linha 8, verifica-se que na linha 15 a variável local_low terá a garantia de ser inicializada localmente_low. Assim, neste momento o aviso "possível utilização da variável não inicializada 'local_low'" não significa "garantida" mas apenas a possível presença de um ramo de passagem onde a variável não é inicializada.

É exactamente isso, dá-lhe um aviso.

Não confunda a sua complacência com a realidade. A realidade é revelada após muitos projectos e a compreensão de que "isto não pode ser porque a lógica conduz mais ou menos" acontece todos os dias.

 
Renat:

Não confunda a sua auto-confiança com a realidade. A realidade é revelada após muitos projectos e a constatação de que "isto não pode ser porque a lógica conduz mais ou menos" acontece diariamente.

Consegue obter uma explicação adequada? O código é dado, a declaração de "direitos próprios" é indicada, onde está o erro? Não compreendo o esoterismo.

...Se considerar a tradução da frase"possível utilização de variável não-inicializada", o aviso é de facto emitido "absolutamente correcto". Mas não se trata de "garantido", mas apenas da possível existência de um ramo de um passe onde a variável não é inicializada. É exactamente disso que estou a falar "com confiança".

 
Yedelkin:

Podemos obter uma explicação adequada? O código é dado, a declaração de "direitos próprios" é indicada, onde está o erro? Não compreendo o esoterismo.

E se, em vez de

interrupcion=true;

em vez de (por exemplo)...

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
Também faria uma reclamação? Especialmente se algumaFunçãoN consiste em centenas de linhas de código?

De acordo com o seu código, sim, a variável é inicializada se a linha 15 for executada. Mas o que diria ao compilador para fazer no exemplo que eu dei? A tarefa é difícil. E também não há necessidade de o resolver.

O erro chama-se"possível (talvez) utilização de variável não-inicializada" (embora de qualquer forma se saiba).

É melhor atribuir explicitamente algum valor à variável local_low. Acredite, pode salvá-lo de possíveis erros no futuro (o código é corrigido, algo é removido, algo é movido, algo é alterado, e a linha 13 pode cair fora deste processo)

 
Yedelkin:

Podemos obter uma explicação adequada? O código é dado, a declaração de "direitos próprios" é indicada, onde está o erro? Não compreendo o esoterismo.

No mundo real, quando a grande maioria dos programadores em qualquer língua escreve código completamente desprotegido e com falhas, os compiladores devem ser feitos com o maior rigor possível. A complacência dos programadores "a lógica é clara, não deve haver problemas, tudo é inicializado como deve ser" traz e ainda traz e trará muitos erros.

É por isso que as questões sobre críticas a medidas rigorosas são aqui irrelevantes.

 
Renat:

... A auto-confiança dos programadores "a lógica é clara, não deve haver problemas, tudo é inicializado correctamente" tem causado, traz e trará um enorme número de erros.

É por isso que as críticas a medidas rigorosas são aqui irrelevantes.

Vamos passar sem críticas. Mais ainda, não o coloquei nas minhas palavras. E quanto à presença de críticas da minha parte, estás profundamente enganado.

Então, qual é o seu erro? Uma vez que não se pode colocar esoterismo num código, responda-me por favor sobre a linguagem da lógica. Ou seja, numa língua que qualquer programador possa compreender.

 
notused:

também faria uma reclamação ? Especialmente se algumaFunçãoN consiste em centenas de linhas de código?

Também se encontra no mesmo local. Bem, não tenho quaisquer queixas. Quero apenas deixar claro que nem tudo é tão categórico como diz Renat.

E quanto ao código? Dei-vos uma amostra de código específico que refuta categoricamente a declaração de Renat, usando uma lógica comum. Obrigado pelo conselho, estou sempre a tentar melhorar.

 
Yedelkin:

Vamos dispensar as críticas. Especialmente porque não o coloquei nas minhas palavras. E quanto à existência de críticas da minha parte, estás profundamente enganado.

Então, qual é o seu erro? Uma vez que não se pode colocar esoterismo num código, responda-me por favor sobre a linguagem da lógica. Ou seja, numa língua que qualquer programador possa compreender.

Tem"possível utilização da variável não-inicializada 'local_low'".

E o que é que se obtém se

(1)         double local_low=1.1; // или что-то другое
 
Yedelkin:

Então, o que é um erro? Uma vez que não se pode colocar esoterismo no código, por favor responda na linguagem da lógica. Ou seja, numa língua que qualquer programador possa compreender.

Releia as minhas respostas do ponto de vista de um gestor de uma empresa de software que trouxe muitos projectos de software para o mercado.

Caso contrário, permanecendo ao nível de "qualquer programador", não compreenderá qual é o erro.