Autor Tema: Problema con C??  (Leído 3959 veces)

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

Desconectado maritov

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 121
Problema con C??
« 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????

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Problema con C??
« Respuesta #1 en: 11 de Octubre de 2008, 01:46:11 »
unsigned int espera;

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Problema con C??
« Respuesta #2 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

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Problema con C??
« Respuesta #3 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?

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Problema con C??
« Respuesta #4 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.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con C??
« Respuesta #5 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
El papel lo aguanta todo

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Problema con C??
« Respuesta #6 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 !

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Problema con C??
« Respuesta #7 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).
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado maritov

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 121
Re: Problema con C??
« Respuesta #8 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? 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

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Problema con C??
« Respuesta #9 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
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con C??
« Respuesta #10 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
El papel lo aguanta todo

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Problema con C??
« Respuesta #11 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
« Última modificación: 14 de Octubre de 2008, 17:08:18 por MLO__ »
El papel lo aguanta todo


 

anything