TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: maritov en 10 de Octubre de 2008, 23:57:05

Título: Problema con C??
Publicado por: maritov en 10 de Octubre de 2008, 23:57:05
Hola Gente!!

estoy evaluado lo sigiente en un if:

Código: [Seleccionar]
if(espera - 0x09)> 0x05 )
los declaré así:

Código: [Seleccionar]
char espera;
Lo que sucede es que cuando espera=8, la condicion es TRUE, o sea, cuando la resta es negativa me lo toma que es mayor 5.
Alguien sabe como tratar esto????
Título: Re: Problema con C??
Publicado por: Nocturno en 11 de Octubre de 2008, 01:46:11
unsigned int espera;
Título: Re: Problema con C??
Publicado por: PalitroqueZ en 11 de Octubre de 2008, 19:02:11
Si ese if está copiado textualmente del código original, pués ni debería compilar

if((espera - 0x09)> 0x05 )

le falta un paréntesis

Título: Re: Problema con C??
Publicado por: gera en 11 de Octubre de 2008, 21:30:38
Si ese if está copiado textualmente del código original, pués ni debería compilar

if((espera - 0x09)> 0x05 )

le falta un paréntesis



No se q onda CCS, pero por lo menos el gcc en la compu, resuelve todas las operaciones antes de compararlas. No es asi en CCS?
Título: Re: Problema con C??
Publicado por: PalitroqueZ en 13 de Octubre de 2008, 17:16:00
La precedencia de los operadores es algo que he visto en muchos lenguajes de programación.

primero se ejecuta lo que está encerrado entre-paréntesis

pero no se si es un error de tipeo de maritov.

Título: Re: Problema con C??
Publicado por: MLO__ en 14 de Octubre de 2008, 14:43:33
Hola.

La variable espera deberia declararse como signed int.

PD// Ojo con los rangos de las variables.

Saludos
Título: Re: Problema con C??
Publicado por: RICHI777 en 14 de Octubre de 2008, 15:03:19
Hola, el problema es como toma el compilador el default del char, que puede ser asgineado o signeado, aca es claro que lo toma como asigneado, ya que 8-9 = -1 o 0xFF y por ende mayor que 5, seguramente el compilador te permita cambiar esto o sino hace como te indica MLO.

Saludos !
Título: Re: Problema con C??
Publicado por: jfh900 en 14 de Octubre de 2008, 15:16:30
Toma ya "palabro1", no seria mejor decir: "lo toma con signo o sin signo", lo comento por que seguramente algún lector del hilo se quede con la boca abierta preguntándose que es eso de "signeado"

Un saludo







1- palabro: Palabra mal dicha o estrambótica. (tomado de la página de la RAE).
Título: Re: Problema con C??
Publicado por: maritov en 14 de Octubre de 2008, 15:45:48
Antes que nada amigos, gracias por ineresarse y aportar, voy a ir respondiendo por partes aca cada uno de Uds.:

unsigned int espera;

Probé de esa manera y el problema persiste.

Si ese if está copiado textualmente del código original, pués ni debería compilar

if((espera - 0x09)> 0x05 )

le falta un paréntesis


Corregí el tema de los parentesis!! Y el problema persiste aún!!

La precedencia de los operadores es algo que he visto en muchos lenguajes de programación.

primero se ejecuta lo que está encerrado entre-paréntesis

pero no se si es un error de tipeo de maritov.


Corregí el tema de los parentesis!!!

Hola.

La variable espera deberia declararse como signed int.

PD// Ojo con los rangos de las variables.

Saludos

Probé con signed int espera; .....y el problema persiste!!!! :? ¿Pero por lo que entiendo signed en 8 bits no va desde -128 a 127??

Hola, el problema es como toma el compilador el default del char, que puede ser asgineado o signeado, aca es claro que lo toma como asigneado, ya que 8-9 = -1 o 0xFF y por ende mayor que 5, seguramente el compilador te permita cambiar esto o sino hace como te indica MLO.

Saludos !

Coincido con vos!! Ahora, ¿habrá alguna manera que 0xff NO sea -1?

A modo de conclusión yo veo que una variable int (o int8, ya no uso mas char para evitar confusiones) está expresada en complemento a dos, o sea que un numero de 8 bits puede representar desde -128 a 127. Mi pregunta: ¿Habrá alguna manera de NO usar complemento a doscomplemento a dos (http://es.wikipedia.org/wiki/Complemento_a_dos)? Yo creí que usando unsigned lo lograba....pero no!.

Saludos


Toma ya "palabro1", no seria mejor decir: "lo toma con signo o sin signo", lo comento por que seguramente algún lector del hilo se quede con la boca abierta preguntándose que es eso de "signeado"

Un saludo




1- palabro: Palabra mal dicha o estrambótica. (tomado de la página de la RAE).

Si esto que dice jfh900 hace bien a la comunicación (y asi lo creo), bienvenido sea!!!

Saludos a todos
Título: Re: Problema con C??
Publicado por: jfh900 en 14 de Octubre de 2008, 15:54:21
Prueba a utilizar una variable intermedia:

Código: [Seleccionar]
unsigned int operacion;

operacion = espera - 0x09;
if(operacion > 0x05 )


También puedes probar un TypeCast:

if((unsigned int)(espera - 0x09)> 0x05 )

Un saludo
Título: Re: Problema con C??
Publicado por: MLO__ en 14 de Octubre de 2008, 16:34:12
Hola.

Por eso te coloque la PD, por el rango. Para aumentar el rango colocalo como signed int16 o signed int32.

Saludos
Título: Re: Problema con C??
Publicado por: MLO__ en 14 de Octubre de 2008, 16:50:17
Hola

Pues lo he probado asi:

Código: C#
  1. #include<16F877A.h>
  2. #fuses XT
  3. #use delay(clock=4M)
  4.  
  5. signed int espera=0;
  6.  
  7. void main (void)
  8. {
  9.  while(true)
  10.  {
  11.         if((espera-0x09)>0x05)
  12.                 on(pin_e0);
  13.         else
  14.                 on(pin_e1);
  15.               espera++;
  16.  }
  17. }

y si cambia  :-/

Saludos