OLP. Problemas de aplicación - página 14

 
Yedelkin:

"Acceso a puntero no válido" =="Intento de acceso a un puntero no válido"? Si es así, entonces

Un puntero puede ser inválido en los siguientes casos:

  • el puntero es NULL;
  • si el objeto fue eliminado con el operador de eliminación.

El primer caso es el mío.

Estaría encantado de utilizar CheckPointer() y otros métodos de comprobación (no he nacido por la mañana), pero desmontar el EA del gráfico no me da la oportunidad.

A ver si lo entiendo: si especifico en el constructor que el puntero es igual a NULL y detengo cualquier acción con él, el Asesor Experto obtendrá 281 y saldrá (mientras que según mi idea no debería).

Pero si llamas a Init o InitXXX después del constructor (similar a CExpert) , todo funciona correctamente...

 
Interesting:

La primera opción es mi caso.

Estaría encantado de utilizar CheckPointer() y otros métodos de comprobación (nací el mismo día), pero la caída del EA desde el gráfico no me da la oportunidad de hacerlo.

A ver si lo entiendo: si especifico en el constructor que el puntero es igual a NULL y rompo todas las acciones posibles con él, el EA obtendrá 281 y saldrá (y según mi idea no debería).

Pero si llamas a Init o InitXXX después del constructor (similar a CExpert) , todo funciona correctamente...


Si hubieras manejado las excepciones, podrías averiguar fácilmente cuál es el problema y solucionarlo.
 
Interesting:

La primera opción es mi caso.

Estaría encantado de utilizar CheckPointer() y otros métodos de comprobación (creo que no nací ayer), pero al desmontar el EA del gráfico no me da la oportunidad de hacerlo.

A ver si lo entiendo: si especifico en el constructor que el puntero es igual a NULL y detengo cualquier acción con él, el Asesor Experto obtendrá 281 y saldrá (mientras que según mi idea no debería).

Si llamas a Init o InitXXX después del constructor (similar a CExpert) , todo funciona como debería...

Todavía no he tratado con los métodos Init o InitXXX, pero yo interpretaría el "EA crashing" de la siguiente manera: el programa en tiempo de ejecución se topa con un puntero incorrecto y este cuello de botella debe ser buscado en el código. Mi constructor inicializa un puntero a NULL también, pero no sale nada.

Si he entendido mal la pregunta, lo siento.

 
Interesting:

Gracias, ahora todo está en su sitio. Pero, hay una pregunta adicional - Supongamos que se produce el error 281, pero es deseable que el EA no se descargue. ¿Cómo debemos manejarla?

Permítanme aclarar mi pregunta: ¿Qué hacer si el error 281 se produce después de todos los pasos de la inicialización, pero no afectará el trabajo principal del Asesor Experto lo suficientemente crítico como para no ejecutarlo en absoluto?

No habrá manejo de excepciones.

Sólo hay una salida: no utilizar punteros incorrectos.

Si existe la posibilidad (distinta de cero) de que un puntero sea incorrecto, asegúrese de comprobarlo antes de utilizarlo.

 
uncleVic:

No habrá manejo de excepciones.

La única salida es no utilizar punteros no válidos.

Si existe la posibilidad (distinta de cero) de que un puntero sea incorrecto, asegúrese de probarlo antes de utilizarlo.


SIEMPRE hay una posibilidad (distinta de cero) de que un puntero no sea válido.

Por lo tanto, debe comprobar siempre su validez antes de cada uso. No sólo después de la creación.

No siempre, pero es lo que hago en los momentos críticos :(


Oh, mierda, en qué se convierte un código puramente transparente :) cuando se utiliza su recomendación.

 
Yedelkin:

Todavía no he tratado con los métodos Init o InitXXX, pero yo interpretaría lo de "sacar el EA del gráfico" de la siguiente manera: el programa durante su ejecución tropieza con un puntero incorrecto y es este cuello de botella en el código el que hay que buscar. Mi constructor inicializa un puntero a NULL también, pero no sale nada.

Si he entendido mal la pregunta, lo siento.

Si se trata de la clase CExpert, debe llamar al menos a Init(...). Todos los punteros allí se inicializan como punteros a objetos de clases base...
 
falkov:

SIEMPRE hay una posibilidad (distinta de cero) de que un puntero no sea válido.

Por lo tanto, siempre debe comprobar su validez antes de cada uso.

No siempre, pero en áreas críticas sí :(


Joder, en qué se convierte un código puramente transparente :) al usar tu recomendación.

Alternativa: ¿Tener un código limpio y transparente que salga volando ante un puntero inválido?
 
uncleVic:
Alternativa: ¿Tienes un código limpio y transparente que falla en caso de puntero inválido?

Alternativa: Tener un código limpio y transparente.

En puntero inválido y otras situaciones excepcionales (fallo de alimentación, espacio en disco, etc. situaciones EXCLUSIVAS) el programa va al bloque de manejo de excepciones, donde el respetable (y yo también :) podría imprimir los valores de las variables y el error, analizar la situación y entender cuál es el problema. Y, si no hay reacción a lo ocurrido en este bloque, abandona.

Por supuesto, esto no invalida los controles estándar y necesarios. Esto sólo es aplicable en SITUACIONES EXCEPCIONALES.

 
uncleVic:
Si se trata de la clase CExpert, debe llamar al menos a Init(...). Todos los punteros allí se inicializan como punteros a objetos de clases base...

Por ejemplo, si Init o InitXXX se ejecuta con un error (devuelve false), ¿qué ocurre entonces?

¿O qué hacer si durante la ejecución el EA sigue recibiendo 281 (a pesar de todas las comprobaciones y trucos), pero no hay ningún comerciante alrededor?

No es una buena idea:

Si hubiera manejado las excepciones, podría averiguar fácilmente lo que estaba mal y manejar la situación.

Los controles están presentes en casi todos los pasos, pero desgraciadamente la tramitación no está...

PS

En cuanto a la salida del EA del gráfico, ¿qué hacer para que el EA esté "vivo" en cualquier inicialización?

 
uncleVic:
Alternativa: ¿Para tener un código limpio y transparente, que se cuelgue por puntero inválido?

Bueno, ese es el punto que vuela hacia fuera, dejar que "yo" mismo para decidir en este caso si el experto debe ser derribado o no.

Al fin y al cabo, ni siquiera estamos hablando de que se aplique un puntero "roto" en algún lugar, aunque personalmente tengo una comprobación antes de aplicarlo (aunque puedo implementar otra comprobación en el temporizador).

De alguna manera he aprendido a vivir en armonía con los indicadores y no me importan mucho los resultados de la inicialización, pero no puedo hacerme amigo de los punteros.

Yedelkin:

Todavía no he tratado con los métodos Init o InitXXX, pero yo interpretaría el "dumping de EA" de la siguiente manera: el programa en tiempo de ejecución se topa con un puntero incorrecto y este cuello de botella debe ser buscado en el código. Mi constructor inicializa un puntero a NULL también, pero no sale nada.

Si he entendido mal la pregunta, pido disculpas.

Actualmente, para resolver el problema estoy devolviendo 0 en el bloque de inicialización.

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

//Processing process of the initialization

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

Según he entendido es la mejor salida para mí (para que EA no se cuelgue en la inicialización). Es decir, en cualquier caso resulta OnInit = 0, no puedo juzgar lo correcto que es.

Razón de la queja: