Autor Tema: Validando un IF  (Leído 12385 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado reiniertl

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Validando un IF
« Respuesta #15 en: 17 de Marzo de 2008, 19:43:53 »
Si, resulota raro que exista un error no corregido de esa naturaleza en GCC, precisamente porque es para fanáticos es que ponen mucho empeño en hacerlo bueno, ni hablar de la cantidad de aplicaciones para LINUX que se hacen con ese compilador.

O es un problema de configuración del compilador, como te comenta maunix, o es algún problema en la lógica (no parece) o es simplemente algo que desconocemos todos y no tenemos la respuesta correcta.

Yo votaría por seguir el consejo del mono asustado, a pesar del susto suele ser muy preciso en sus recomendaciones.

Saludos
Reinier

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Validando un IF
« Respuesta #16 en: 18 de Marzo de 2008, 04:57:23 »
A mi esto me funciona perfectamente en MinGW:

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define PAD_BUTTON_A 0x0100
  5. #define PAD_BUTTON_B 0x0200
  6.  
  7. int main() {
  8.     int buttonsdown = 0x0300;
  9.     int resultado = buttonsdown & ( PAD_BUTTON_B | PAD_BUTTON_A );
  10.     printf( "%x, %x, %x, %x\n", buttonsdown, PAD_BUTTON_A, PAD_BUTTON_B, resultado );
  11.  
  12.     if ( buttonsdown & ( PAD_BUTTON_B | PAD_BUTTON_A ) ) {
  13.         printf( "Sip\n" );
  14.     }
  15.     else {
  16.         printf( "Nop\n" );
  17.     }
  18.  
  19.     system( "pause" );
  20.     return 0;
  21. }

La salida del programa es:
300, 100, 200, 300
Sip
Presione una tecla para continuar...

Yo verificaría el valor de buttonsdown antes de evaluar el if.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Validando un IF
« Respuesta #17 en: 18 de Marzo de 2008, 11:55:26 »
Hola Geo

Funciona bien, pero como comentaba Menta unos mensajes arriba, si solo se presiona B...

buttonsdown & ( PAD_BUTTON_B | PAD_BUTTON_A ) daría como resultado 0x0200, el cual de todas formas validaría el if.

Pero ya no estoy preocupado por ahora, ya dejé en el pasado este bug.  :mrgreen:

Gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Validando un IF
« Respuesta #18 en: 19 de Marzo de 2008, 15:10:24 »
Pero ya no estoy preocupado por ahora, ya dejé en el pasado este bug.  :mrgreen:

Pero en el caso de GEO creo que ha probado todas las posibilidades, al menos eso es lo que leo de su salida (300, 100, 200)

En cuanto a lo de bug, habría que ver, por eso te mencioné lo de las opciones de compilador.

El GCC en modo de comandos tiene posibilidad de que se le pase como parámetro el nivel de optimización, tal vez por default es máximo pero bien podrías pasarle que lo desactive.

El código que puso Geo no es idéntico al tuyo, ya que ha eliminado algunas cosas, lo cual podría afectar la labor del compilador.

Si tienes ganas de seguir probando, prueba de agregarle "volatile" antes de int buttonsdown.

Quedaría así su declaración


volatile int buttonsdown


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Validando un IF
« Respuesta #19 en: 19 de Marzo de 2008, 16:50:15 »
Sí es cierto, Richi en otro tema me comentó que poniéndole Volatile se elimina la optimización. Lo voy a probar y te comento los resultados Mauricio.  8)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Validando un IF
« Respuesta #20 en: 20 de Marzo de 2008, 16:49:08 »
Sí es cierto, Richi en otro tema me comentó que poniéndole Volatile se elimina la optimización. Lo voy a probar y te comento los resultados Mauricio.  8)

Mmm, técnicamente no es que se elimina la optimización del código, solo que el compilador tiene presente que la variable en cuestión puede ser modificada por el bucle en cuestión o por otro, en una forma que no puede ser analizada por el análisis líneal del código.

Por ende tiene más cuidado con el tratamiento de la variable en cuestión en todas las partes del código donde se la use, lo cual no significa que el resto de l código no quede optimizado.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Validando un IF
« Respuesta #21 en: 20 de Marzo de 2008, 21:08:16 »
¿Qué crees Mauricio? Que no funcionó tampoco  :cry:

Le puse volatile y el resultado fue el mismo. El código involucrado es

Código: [Seleccionar]
    //Si presiona A y B activa motor del control
    if(buttonsdown&(PAD_BUTTON_B|PAD_BUTTON_A))
        motor=1;
    //Si presiona A y Z desactiva motor del control
    if(buttonsdown&(PAD_TRIGGER_Z|PAD_BUTTON_A))
        motor=0;

Pero desde los programas anteriores noté un detalle raro con el código de arriba...

- Presiona A+B no pone a 1 el motor
- Presiona B pone a 1 el motor
- Presiona A pone a 0 el motor
- Presiona Z pone a 0 el motor

Un comportamiento sumamente raro.

Pero todo funciona al 100% si uso:

Código: [Seleccionar]
    //Si presiona A y B activa motor del control
    if((buttonsdown&(PAD_BUTTON_B|PAD_BUTTON_A))==(PAD_BUTTON_B|PAD_BUTTON_A))
            motor=1;
    //Si presiona A y Z desactiva motor del control
    if((buttonsdown&(PAD_TRIGGER_Z|PAD_BUTTON_A))==(PAD_TRIGGER_Z|PAD_BUTTON_A))
            motor=0;

Declaro la guerra contra el if ganada por los bits raros del compilador GCC  :D de ahora en adelante seré más específico en mis sentencias  8)

Desconectado ma4826

  • PIC16
  • ***
  • Mensajes: 130
Re: Validando un IF
« Respuesta #22 en: 20 de Marzo de 2008, 23:21:12 »
De la primera forma el primer if se activa si pulsas A o B y el segundo si pulsas A o Z.

Si pulsas A+B -> Primer if pone motor = 1, el segundo if pone motor = 0, resultado final motor = 0;
Si pulsas B -> Primer if pone motor = 1, el segundo if no hace nada, resultado final motor = 1;
Si pulsas A -> Primer if pone motor = 1, el segundo if pone motor = 0, resultado final motor = 0;
Si pulsas Z -> Primer if no hace nada, el segundo if pone motor = 0, resultado final motor = 0;

Con la segunda opción el primer if se activa solo cuando pulsas A y B a la vez y el segundo cuando pulsas A y Z a la vez.

Está funcionando como debe.

Saludos,

Miguel Angel.
万人の友は誰の友でもない。

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Validando un IF
« Respuesta #23 en: 21 de Marzo de 2008, 00:52:32 »
 :shock:
 :D
 :oops: :oops:

Pero como no lo razoné antes... Miguel Angel, has resuelto el enigma de los $64,000.00  :D

Qué bien, gracias por analizarlo, de veras que me equivoqué y feo  :D  :g) nunca se me ocurrió analizarlo secuencialmente, solo veía a los if's como si estuvieran solos.

Ahora exonero al GCC de cualquier culpa y aprendí algo nuevo el día de hoy.  :P
« Última modificación: 21 de Marzo de 2008, 00:56:06 por migsantiago »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Validando un IF
« Respuesta #24 en: 21 de Marzo de 2008, 02:47:32 »
Grandísima lección que nos has dado a todos los que nos habíamos obcecado en verlo de otra manera.
Y lo peor de todo es que yo he cometido alguna vez ese mismo error en otras circunstancias y no había caído.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Validando un IF
« Respuesta #25 en: 21 de Marzo de 2008, 13:11:25 »
Un aplauso para Ma4826   :lol:
Como decia un viejo amigo mio...."Que el arbol nunca tape al bosque"...
Saludos !

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re: Validando un IF
« Respuesta #26 en: 21 de Marzo de 2008, 21:56:44 »
Je, nos quedamos con la primer parte :P.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/