Limpeza de matriz forçada em MT5? - página 2

 
Artyom Trishkin:

É claro que sim.

Qualquer programador que respeite a si mesmo e seus programas não deixará que as coisas corram seu curso. Na MQL4, se você não usar #propriedade estrita, você pode se referir a uma matriz com tamanho 10 por índice 20. E nada vai acontecer - o programa continuará a funcionar, mas cabe ao programador decidir o que usar em seguida. Se ele for inteligente, certamente verificará e controlará tudo, de modo a não obter valores fora da matriz, mas se ele o fizer "grosso modo", ele não pensa em tal controle, e "o principal é que ele funciona, mas como funciona - de alguma forma...".
A maioria dos usuários, que não se preocuparam com isso, tem reclamado da "má, má e complicada MQL5", porque ela não lhes permite falsificar suas próprias criações como antes. Mas aqueles que originalmente pensavam e criavam código com verificações e controle dos dados recebidos, não notaram nenhuma diferença na complexidade dos idiomas, e agora se perguntam - "onde está a complexidade - é a mesma...".

O código mostrou que a divisão por zero sem #propriedade estrita é permitida e o planeta não está se desmoronando em um buraco negro, mas às vezes se quer dividir por zero, mas eles não deixam que se faça isso
 
Алексей Тарабанов:

Nikolai, não se preocupe com a MQL4, lá tudo está bem. O iniciante do tópico preenche as matrizes como ele gosta. Tudo.

Artyom Trishkin:

É claro que sim.

Qualquer programador, que respeite a si mesmo e seus programas, não deixará as coisas escorregarem. Na MQL4, se você não usar #propriedade estrita, você pode se referir a uma matriz com tamanho 10 por índice 20. E nada vai acontecer - o programa continuará a funcionar, mas cabe ao programador decidir o que usar em seguida. Se ele for inteligente, certamente verificará e controlará tudo, de modo a não obter valores fora da matriz, mas se ele o fizer "grosso modo", ele não se importa com esse controle, e "o principal é que ele funciona, e como - de alguma forma...".
A maioria dos usuários, que não se preocuparam com isso, tem reclamado da "má, má e complicada MQL5", porque ela não lhes permite falsificar suas próprias criações como antes. Mas aqueles que originalmente pensavam e criavam código com verificação e controle dos dados recebidos, não notaram nenhuma diferença na complexidade dos idiomas, e agora se perguntam - "onde está a complexidade - é a mesma...".

Que chatice!
Bem, Petr, graças ao rigor da MQL5, você tem uma chance de colocar o código em ordem relativa e limpar a pilha de lixo.
Você pode até tentar compilar o código fixo com #property strict back para MQL4 e talvez funcione muito mais rápido no MT4

 
Nikolai Semko:

Que chatice!
Bem, Peter, graças ao rigor da MQL5, temos uma chance de colocar o código em ordem relativa e limpar as pilhas de lixo.
Você pode até tentar compilar o código fixo com #property strict back em MQL4 e, talvez, ele funcione muito mais rápido em MT4

Foi assim que, a priori, você decidiu que meu código está cheio de lixo.

Deixe-me explicar: o miolo é preenchido em etapas, em várias etapas. Se ao declarar array no MT5 há lixo nele (o que eu não sabia), então nos primeiros passos de construção do kernel em funções, o array está fora do escopo, porque ao invés de ponteiros para variáveis, eu me refiro a uma célula do kernel através de outra. Se contiver zero, está OK, e obtém o valor correto na segunda corrida, mas se contiver lixo, ocorre um erro crítico.

Isso está claro para você?

 
Nikolai Semko:
Peter, eu não sei o que você quer dizer.
...

Exatamente, você não entendeu. Você está comparando minhas tarefas com as suas...

 
...
Se você tiver transbordamentos acontecendo, procure por erros em si mesmo.
E se há lixo, é seu lixo que você não limpou.

Eu não tenho nenhum transbordo. Considere as especificidades da minha tecnologia (esqueça que você a está ignorando). Se você usar outra célula da matriz como ponteiro para uma célula, e houver lixo nela, então você está fora da matriz. O problema é que, para que a célula a que você se refere obtenha o valor correto, você tem que ir para a segunda rodada de construção do núcleo. E na segunda rodada, o valor será correto. Mas não se chega ao segundo round por causa de um erro crítico.

Tudo isso é devido ao lixo no conjunto que está sendo declarado.

Portanto, precisamos inventar mecanismos para limpar a matriz bidimensional (kernel) no estágio da primeira configuração de tamanho (construção da área regular) e no estágio do segundo redimensionamento do kernel, ao construir a área do usuário.

 
Реter Konow:

Exatamente, você não entendeu. Em comparação, minhas tarefas e suas próprias...

Vá em frente e crie um monólogo - mais 10 postos em uma fila.

 
Реter Konow:

Foi assim que, a priori, você decidiu que meu código está cheio de lixo.

Deixe-me explicar: o miolo é preenchido em etapas, em várias etapas. Se ao declarar array no MT5 há lixo nele (o que eu não sabia), então nos primeiros passos da construção do kernel em funções, o array está fora do escopo, porque ao invés de ponteiros para variáveis, eu me refiro a uma célula do kernel através de outra. Se contiver zero, está OK, e obtém o valor correto na segunda corrida, mas se contiver lixo, ocorre um erro crítico.

Isso está claro para você?

Não énada disso. Não é o lixo que tem a culpa, mas a ausência de #propriedade rigorosa em mql4. Sem este gimmick, você recebe 0 em vez de um array overrun, e em mql5 já é um erro crítico. Provavelmente, é melhor verificar o comprimento da matriz ao invés do conteúdo de um índice de matriz inexistente.

 
Alexey Viktorov:

ARetag não é nada disso. Não é o lixo que tem a culpa, é a falta de #propriedade rigorosa em mql4. Sem este gimmick, você recebe 0 em vez de uma ultrapassagem de matriz, e em mql5 já com erro crítico. Provavelmente, é melhor verificar o comprimento da matriz ao invés do conteúdo de um índice de matriz inexistente.

Fora dos limites ocorre porque há lixo na célula indicadora.

Por exemplo:

G_CORE[Объект][Канвас] = G_CORE[Окно][Его_канвас];

Inicial:

G_CORE[Object][Kanvas] = -123423452345; (lixo)

G_CORE[Window][His_canvas]= -452345; (lixo)

//-----------------------------------------------------------------

O resultado está fora de série.

Para reiterar. Algumas células têm valores zero em MT4 e são preenchidas no segundo turno no primeiro estágio de enchimento do núcleo.

No MT5, devido ao lixo nas células, há um erro crítico na primeira rodada.

Se as células da matriz tivessem zeros, não haveria erro e o núcleo se encheria sequencialmente (como deveria).

 

Aqui está um exemplo mais preciso:

A primeira rodada de construção do núcleo. Em uma das funções:

int Ширина_канваса = G_CORE[G_CORE[Окно][Его_канвас]][_X_SIZE];

Если G_CORE[Окно][Его_канвас] = 234523452345; (мусор) то ошибка. А если бы G_CORE[Окно][Его_канвас] = 0; Ошибки нет, и ядро продолжает нормально строится.
 
Реter Konow:

Fora dos limites ocorre porque há lixo na célula indicadora.

Por exemplo:

Inicial:

G_CORE[Object][Kanvas] = -123423452345; (lixo)

G_CORE[Window][His_canvas]= -452345; (lixo)

//-----------------------------------------------------------------

O resultado está fora de série.

Para reiterar. Algumas células têm valores zero em MT4 e são preenchidas no segundo turno no primeiro estágio de enchimento do núcleo.

No MT5, devido ao lixo nas células, há um erro crítico na primeira rodada.

Se houvesse zeros nas células da matriz, não haveria erro e o núcleo seria preenchido sequencialmente (como deveria ser).

A não-inicialização da matriz é inteiramente culpa do kodopistael. Procure o erro em seu próprio ambiente. Reconstrua seu algoritmo.