FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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); } 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. |
#2
|
||||
|
||||
Cita:
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 .... |
#3
|
||||
|
||||
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(); } |
#4
|
||||
|
||||
Cita:
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 .... |
#5
|
||||
|
||||
¿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) Código:
#define ON_WRITE PAGE_EXECUTE_READ | PAGE_GUARD |
#6
|
||||
|
||||
Hola aguml.
Cita:
De este modo: Código:
#define ON_WRITE PAGE_EXECUTE_READ | PAGE_GUARD Código:
if (Valor == ON_WRITE) Código:
if ( (Valor == PAGE_EXECUTE_READ) | PAGE_GUARD) La declaración que corresponde a tu propósito es: Código:
#define ON_WRITE ( PAGE_EXECUTE_READ | PAGE_GUARD ) Código:
if (Valor == ( PAGE_EXECUTE_READ | PAGE_GUARD ) ) 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"); }
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#7
|
||||
|
||||
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.
|
|
|
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 |
|