![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
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.
|
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|