Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-04-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Problemas con un condicional

Hola amigos, pues mi problema es que no consigo hacer que este condicional haga lo que yo quiero:

Código:
if((DebugEv.u.Exception.ExceptionRecord.ExceptionInformation[0] == 0 && Dbg->MemoryBP.Type == ON_ACCESS) ||
   (DebugEv.u.Exception.ExceptionRecord.ExceptionInformation[0] == 0 && Dbg->MemoryBP.Type == ON_EXECUTION) ||
   (DebugEv.u.Exception.ExceptionRecord.ExceptionInformation[0] == 1 && Dbg->MemoryBP.Type == ON_WRITE))
{
         Synchronize(OnMemoryBPEventThread);
}
Lo explico un poco:
La variable DebugEv.u.Exception.ExceptionRecord.ExceptionInformation[0] da 0 si la excepcion es por ejecucion o por lectura y da 1 si es por escritura.
ON_ACCESS, ON_EXECUTION y ON_WRITE son tres constantes que defino asi:

#define ON_ACCESS PAGE_NOACCESS
#define ON_WRITE PAGE_EXECUTE_READ | PAGE_GUARD
#define ON_EXECUTION PAGE_READWRITE | PAGE_GUARD

La idea es que solo entre en uno de estos 3 casos:
1ª linea -> si ExceptionInformation[0] == 0 y el tipo es ON_ACCESS
2ª linea -> si ExceptionInformation[0] == 0 y el tipo es ON_EXECUTION
3ª linea -> si ExceptionInformation[0] == 1 y el tipo es ON_WRITE

El problema es que entra siempre aunque no se cumplan ninguna de las 3 condiciones, o sea, si el tipo es ON_WRITE y ExceptionInformation[0] == 0 entra y no debería. ¿que hago mal en el condicional? Estoy loco dandole vueltas y no veo el fallo.
Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 04-04-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por aguml Ver Mensaje
...
La idea es que solo entre en uno de estos 3 casos:
1ª linea -> si ExceptionInformation[0] == 0 y el tipo es ON_ACCESS
2ª linea -> si ExceptionInformation[0] == 0 y el tipo es ON_EXECUTION
3ª linea -> si ExceptionInformation[0] == 1 y el tipo es ON_WRITE
Hola aguml.

Según lo que comentas arriba tendría que ser:
Código:
...
  if(((DebugEv.u.Exception.ExceptionRecord.ExceptionInformation[0] == 0) &&
     (Dbg->MemoryBP.Type == ON_ACCESS || Dbg->MemoryBP.Type == ON_EXECUTION)) ||
     (DebugEv.u.Exception.ExceptionRecord.ExceptionInformation[0] == 1 &&
      Dbg->MemoryBP.Type == ON_WRITE))
    ShowMessage("Cumple la condición");
  else
    ShowMessage("No cumple la condición");
...
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 04-04-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Vale, el problema no era ese porque mi condicional, aunque algo menos eficiente, tambien era válido. Al final ha quedado así:

Código:
if((ExceptionAccess.LastExceptionTypeOnMBP == 0 && (Dbg->MemoryBP.Type == int(ON_ACCESS) ||
   (Dbg->MemoryBP.Type == int(ON_EXECUTION) &&
   (ExceptionAccess.LastExceptionAddressOnMBP >= ExceptionAccess.LastExceptionAccessAddressOnMBP) &&
   (ExceptionAccess.LastExceptionAddressOnMBP <= ExceptionAccess.LastExceptionAccessAddressOnMBP)))) ||
   (ExceptionAccess.LastExceptionTypeOnMBP == 1 && Dbg->MemoryBP.Type == int(ON_WRITE)))
{
           OnMemoryBPEventThread();
}
El problema estaba en que las constantes que defino, por alguna razón, no funcionan bien sin el cast ese que le pongo. ¿No hay manera de crear esas constantes usando #define y que se creen como enteros para no tener que hacerles cast?
Responder Con Cita
  #4  
Antiguo 04-04-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por aguml Ver Mensaje
¿No hay manera de crear esas constantes usando #define y que se creen como enteros para no tener que hacerles cast?
Hola aguml.

No estoy seguro de entenderte... ¿ Te referis a algo así ?
Código:
#define ON_ACCESS      1 // (PAGE_NOACCESS)
#define ON_WRITE     288 // (PAGE_EXECUTE_READ | PAGE_GUARD)
#define ON_EXECUTION 260 // (PAGE_READWRITE | PAGE_GUARD)

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 05-04-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
¿hay diferencia entre hacerlo de una manera o de otra a la hora de la comparación?
Me refiero a hacerlo asi:

Código:
#define ON_WRITE     288 // (PAGE_EXECUTE_READ | PAGE_GUARD)
o asi:

Código:
#define ON_WRITE PAGE_EXECUTE_READ | PAGE_GUARD
¿funciona de manera diferente a la hora de la comparación? El caso es que en el depurador, al parar en el condicional, podia ver como ON_WRITE tenia el valor correcto que debia tener pero no procesaba bien el valor. ¿en tu caso si lo haria? ¿acaso es un problema del #define que no trabaja bien como yo lo hice?
Responder Con Cita
  #6  
Antiguo 05-04-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.
Cita:
Empezado por aguml Ver Mensaje
¿hay diferencia entre hacerlo de una manera o de otra a la hora de la comparación?
Depende como hayas declarado la macro.

De este modo:
Código:
#define ON_WRITE PAGE_EXECUTE_READ | PAGE_GUARD
podría arrojar resultados no deseados debido a la precedencia de operadores. Declarada de ese modo, al expandirse en una evaluación tenemos que:
Código:
  if (Valor == ON_WRITE)
es equivalente a escribir:
Código:
if ( (Valor == PAGE_EXECUTE_READ) | PAGE_GUARD)
ya que el operador "==" tiene mayor precedencia que el operador "|". Y definitivamente no es lo que buscas...

La declaración que corresponde a tu propósito es:
Código:
#define ON_WRITE ( PAGE_EXECUTE_READ | PAGE_GUARD )
que al expandirse queda:
Código:
if (Valor == ( PAGE_EXECUTE_READ | PAGE_GUARD ) )
Comprobación:
Código:
#define ON_WRITE1  288
#define ON_WRITE2 (PAGE_EXECUTE_READ | PAGE_GUARD)

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if ( ON_WRITE1 == ON_WRITE2)
    ShowMessage("ON_WRITE1 es igual a ON_WRITE2");
  else
    ShowMessage("ON_WRITE1 es distinto a ON_WRITE2");
}
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 06-04-2014
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
pues no sabia que podia usarse parentesis en un #define y no habia pensado que pudiera ser problema de precedencia de operadores. Mañana hago la prueba y cambio el codigo. Muchisimas gracias por las aclaraciones, sois un foro cojonudo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta condicional? Theluar SQL 4 25-10-2013 06:09:04
Respaldo con condicional dado SQL 4 20-08-2010 20:40:31
Problemas de condicional If whatson Varios 7 18-08-2010 21:57:15
si condicional en interbase??? GustavoCruz Firebird e Interbase 3 18-11-2008 21:10:08
locate condicional gatsoft2 Varios 10 06-05-2005 16:57:37


La franja horaria es GMT +2. Ahora son las 03:57:36.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi