OLP. Questões de aplicação - página 14

 
Yedelkin:

"Invalid pointer access" =="Tentativa de acesso a um ponteiro inválido"? Se sim, então

Um ponteiro pode ser inválido nos seguintes casos:

  • o ponteiro é NULL;
  • se o objecto foi eliminado utilizando o operador de eliminação.

O primeiro caso é meu.

Teria todo o prazer em utilizar CheckPointer() e outros métodos de verificação (não nasci de manhã), mas retirar a EA do gráfico não me dá qualquer hipótese.

Deixem-me esclarecer - se eu especificar no construtor que o ponteiro é igual a NULL e parar quaisquer acções com ele, o Expert Advisor receberá 281 e sairá (enquanto que de acordo com a minha ideia não deve).

Mas se chamar o Init ou InitXXX depois do construtor (semelhante ao CExpert) , tudo funciona correctamente...

 
Interesting:

A primeira opção é o meu caso.

Teria todo o gosto em utilizar o CheckPointer() e outros métodos de verificação (nasci no mesmo dia), mas o crash do gráfico da EA não me dá a oportunidade de o fazer.

Deixem-me esclarecer - se eu especificar no construtor que o ponteiro é igual a NULL e quebrar todas as acções possíveis com ele, a EA receberá 281 e sairá (e de acordo com a minha ideia não deve).

Mas se chamar o Init ou InitXXX depois do construtor (semelhante ao CExpert) , tudo funciona correctamente...


Se tivesse tratado de excepções, poderia facilmente descobrir qual era a questão e resolvê-la.
 
Interesting:

A primeira opção é o meu caso.

Teria todo o prazer em utilizar CheckPointer() e outros métodos de verificação (penso que não nasci ontem), mas o crashing EA do gráfico não me dá qualquer hipótese.

Deixem-me esclarecer - se eu especificar no construtor que o ponteiro é igual a NULL e parar quaisquer acções com ele, o Expert Advisor receberá 281 e sairá (enquanto que de acordo com a minha ideia não deve).

Se chamar o Init ou InitXXX depois do construtor (semelhante ao CExpert) , tudo funciona como deve...

Ainda não lidei com os métodos Init ou InitXXX, mas eu interpretaria "EA sendo puxado para baixo" em si mesmo da seguinte forma: o programa em tempo de execução choca com o ponteiro incorrecto e este gargalo deve ser procurado no código. O meu construtor também inicializa um ponteiro para NULL, mas nada voa para fora.

Se entendi mal a pergunta, lamento.

 
Interesting:

Obrigado, agora tudo está no seu lugar. Mas, há uma questão adicional - Suponha que ocorre um erro 281, mas é desejável que a EA não seja descarregada. Como devemos lidar com isto?

Deixe-me esclarecer a minha pergunta: O que fazer se o erro 281 ocorrer após todas as etapas da inicialização, mas não afectará o trabalho principal do Expert Advisor de forma crítica o suficiente para não o executar de todo?

Não haverá tratamento de excepção.

Só há uma saída - não usar apontadores incorrectos.

Se houver uma possibilidade (diferente de zero) de que um ponteiro possa estar incorrecto, não se esqueça de o verificar antes de o utilizar.

 
uncleVic:

Não haverá tratamento de excepção.

A única saída é não utilizar apontadores inválidos.

Se houver uma possibilidade (diferente de zero) de que um ponteiro possa estar incorrecto, certifique-se de o testar antes de o utilizar.


A possibilidade (diferente de zero) de um ponteiro poder ser inválido é SEMPRE provável!

Por isso, deve sempre verificar a sua validade antes de TODAS as utilizações! Não apenas após a criação.

Nem sempre, mas é isso que faço em pontos críticos :(


Oh merda, em que se transforma um código puro transparente :) quando se usa a sua recomendação.

 
Yedelkin:

Ainda não lidei com os métodos Init ou InitXXX, mas interpretaria "tirar a EA do gráfico" em si mesmo da seguinte forma: o programa durante a sua execução choca com um ponteiro incorrecto e é este estrangulamento no código que precisa de ser procurado. O meu construtor também inicializa um ponteiro para NULL, mas nada voa para fora.

Se entendi mal a pergunta, peço desculpa.

Se estiver a falar da classe CExpert, deve ligar pelo menos ao Init(....). Todos os apontadores lá são inicializados como apontadores para objectos de classes base...
 
falkov:

A possibilidade (diferente de zero) de um ponteiro poder ser inválido é SEMPRE possível!

Por isso, deve sempre verificar a sua validade antes de TODAS as utilizações!

Nem sempre, mas em áreas críticas faço :(


C'um caraças, em que se transforma um código puro transparente :) ao utilizar a sua recomendação.

Alternativa: Ter um código transparente limpo que voa no ponteiro Inválido?
 
uncleVic:
Alternativa: Ter um código limpo e transparente que falha no ponteiro Inválido?

Alternativa: ter um código limpo e transparente.

No ponteiro Inválido e outras situações excepcionais (falha de energia, espaço em disco, etc. Situações EXCLUSIVAS) o programa vai para o bloco de tratamento de excepções, onde o respeitado Interessante (e eu também:) poderia imprimir valores e erros variáveis, analisar a situação e compreender qual é o problema. E, se não houver reacção ao que aconteceu neste bloco, desista.

Evidentemente, isto não invalida as verificações padrão e necessárias. Isto só é aplicável em SITUAÇÕES EXCEPCIONAIS.

 
uncleVic:
Se for classe CExpert, deve chamar pelo menos Init(....). Todos os apontadores lá são inicializados como apontadores para objectos de classes base...

Por exemplo, se o Init ou InitXXX for executado com um erro (devolve falso), o que acontece então?

Ou o que fazer se durante a execução a EA ainda receber 281 (apesar de todas as verificações e truques), mas não houver nenhum comerciante por perto?

Não é uma boa ideia:

Se tivesse tratado de excepções, poderia facilmente descobrir o que estava errado e lidar com a situação.

Os controlos estão lá quase todos os passos, mas infelizmente o processamento não está lá...

PS

Então, sobre a saída da EA do gráfico - o que fazer para tornar a EA "viva" em qualquer iniciação?

 
uncleVic:
Alternativa: Ter um código transparente limpo, a cair por um ponteiro Inválido?

Bem, esse é o ponto que voa, deixe-me eu próprio decidir neste caso se o perito deve ser puxado para baixo ou não.

Afinal, não estamos sequer a falar de um ponteiro "partido" ser aplicado algures, embora eu pessoalmente tenha uma verificação antes de o aplicar (embora eu possa implementar outra verificação no temporizador).

De alguma forma aprendi a viver em harmonia com os indicadores e não me importo muito com os resultados da iniciação, mas não posso fazer amigos com apontadores.

Yedelkin:

Ainda não lidei com os métodos Init ou InitXXX, mas interpretaria o "despejo EA" da seguinte forma: o programa em tempo de execução choca com um ponteiro incorrecto e este estrangulamento deve ser procurado no código. O meu construtor também inicializa um ponteiro para NULL, mas nada voa para fora.

Se compreendi mal a pergunta, peço desculpa.

Actualmente, a fim de resolver o problema, estou a regressar 0 no bloco de inicialização.

int OnInit()
{
//----------------------------------------------------------------------------//

//Processing process of the initialization

//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

Como entendi, é a melhor saída para mim (para que a EA não caia na inicialização). Ou seja, em qualquer caso, resultado OnInit = 0, não posso julgar quão correcto é.

Razão: