Autor Tema: Operación MÓDULO en C18  (Leído 3128 veces)

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

Desconectado Maria33

  • PIC12
  • **
  • Mensajes: 54
Operación MÓDULO en C18
« en: 07 de Julio de 2009, 15:01:41 »
Hola! estoy intentando realizar la operación módulo con el compilador C18 pero no sé por qué motivo no sale el resultado esperado.
Lo que hago es lo siguiente:

int Result;
int a;
BYTE b;
Result = a%b;

Gracias

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Operación MÓDULO en C18
« Respuesta #1 en: 07 de Julio de 2009, 15:18:30 »
Si lo haces así entonces:

0/0 = indeterminado.

Inicializa las variables para que la operación funcione.

Desconectado Maria33

  • PIC12
  • **
  • Mensajes: 54
Re: Operación MÓDULO en C18
« Respuesta #2 en: 07 de Julio de 2009, 15:23:43 »
las variables tiene su valor, pero no lo he puesto. La variable b pertenece a un byte de un array de bytes y a es un int.

Desconectado Maria33

  • PIC12
  • **
  • Mensajes: 54
Re: Operación MÓDULO en C18
« Respuesta #3 en: 07 de Julio de 2009, 15:44:42 »
¿Puede ser que para usar la operación módulo "a%b" tenga que ser uno de los valores a o b una constate?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Operación MÓDULO en C18
« Respuesta #4 en: 07 de Julio de 2009, 18:09:43 »
¿Cuál es el ejemplo que no funciona entonces?

La operación módulo funciona para cualquier cosa mientras las variables tengan valores calculables.

Desconectado Maria33

  • PIC12
  • **
  • Mensajes: 54
Re: Operación MÓDULO en C18
« Respuesta #5 en: 07 de Julio de 2009, 18:49:12 »
Si pongo lo siguiente si funciona:

int result;
bool ;
result = 15887%4
if(result ==3)
{
      enciendeLed1();
}
else
{
      enciendeLed2();

}

En este caso se comprueba que la operación módulo funciona correctamente porque se enciende el Led1.
Pero si pongo lo siguiente no funciona:

int result;
BYTE a = 4;
int b = 15887;
result = ((unsigned char)b) % a;
if(result ==3)
{
      enciendeLed1();
}
else
{
      enciendeLed2();

}
En este caso se enciende el Led2.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Operación MÓDULO en C18
« Respuesta #6 en: 07 de Julio de 2009, 20:50:33 »
El casting que haces destruye el int (16bits pasan a ser 8 bits):
15887 = 0x3E0F

haciendo el casting se truncan bits hasta quedar 8 bits (tamaño de unsigned char):
0x0F

Luego entonces... 0x0F % 0x04 = 0x03

pero por alguna razón no sale 0x03. Le di varias revisadas pero no encuentro el problema con el casting u otra cosa. ¿Qué valor queda en result después de la operación?



Prueba con esta instrucción si lo anterior no ayuda...

Código: [Seleccionar]
result = (int) b % a;

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Operación MÓDULO en C18
« Respuesta #7 en: 07 de Julio de 2009, 22:45:20 »

int result;
BYTE a = 4;
int b = 15887;
result = ((unsigned char)b) % a;
if(result ==3)
{
      enciendeLed1();
}
else
{
      enciendeLed2();

}
En este caso se enciende el Led2.

prueba de cambiar la declaracion de a por int
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Operación MÓDULO en C18
« Respuesta #8 en: 08 de Julio de 2009, 01:41:39 »
Estas con C18???

BYTE es una declaracion de CCS mas no de C18 segun se.

saludos
El papel lo aguanta todo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Operación MÓDULO en C18
« Respuesta #9 en: 08 de Julio de 2009, 01:54:37 »
Estas con C18???

BYTE es una declaracion de CCS mas no de C18 segun se.

saludos
MLO_ Seguramente tiene definido:
#define BYTE unsigned char

Sino el compilador indica error. Creo yo que, con lo indicado por migsantiago  se tiene que solucionar.
No contesto mensajes privados, las consultas en el foro

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: Operación MÓDULO en C18
« Respuesta #10 en: 08 de Julio de 2009, 11:11:14 »

int result;
BYTE a = 4;
int b = 15887;
result = ((unsigned char)b) % a;
if(result ==3)
{
      enciendeLed1();
}
else
{
      enciendeLed2();

}
En este caso se enciende el Led2.

prueba de cambiar la declaracion de a por int
opino lo mismo que che doppel
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com