Autor Tema: Variable boolean en C  (Leído 10956 veces)

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

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Variable boolean en C
« en: 13 de Septiembre de 2005, 06:37:00 »
Bueno necesito hace una estructura de 100 registros en el pic de tipo boolean. El problema es que como es sabido en ansi c no se pensó en el tipo de variable booleana (si/no o 1,0). He pensado hacerlo a través de un typedef pero no sirve de nada...

alguna sugerencia?


Desconectado djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
RE: Variable boolean en C
« Respuesta #1 en: 13 de Septiembre de 2005, 10:16:00 »
Hola compañer@s

tu problema de variables booleanas puedes resolverlas con una simple creacion de una variable enumerada.

Para lengua C
==========
void main (){

     enum boolean {false = 0, true =1};
     enum boolean nombre_variable;
     nombre_variable = true;
     (nombre_variable == true) ? nombre_variable = false : nombre_variable = true;
}

C++
===
void main () {
     enum boolean {false = 0, true =1};
     boolean nombre_variable;
     nombre_variable = true;
     (nombre_variable == true) ? nombre_variable = false : nombre_variable = true;
}


Espero que te sirva de ayuda. y un saludo para tod@s de este novato del foroSonrisa Gigante

Saludos desde Cádiz, España
Web personal: http://www.microtronic.es

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Variable boolean en C
« Respuesta #2 en: 13 de Septiembre de 2005, 10:26:00 »
Nunca había visto esta sintaxis:

 (nombre_variable == true) ? nombre_variable = false : nombre_variable = true;

¿Debo entender que ? es IF,  y que : es ELSE?

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Variable boolean en C
« Respuesta #3 en: 13 de Septiembre de 2005, 10:35:00 »
Jeje a eso se le llama operador ternario condicional (? : ), su sintaxis:
Codigo:
expresion_1?expresion_2:expresion_3;


Evalua expresion_1, si es cierta toma la expresion_2, si es falsa toma la expresion_3......ejemplo:

x=10;
y=x>9 ?100:200;

Como "x" es mayor que 9, "y" tomara el valor de 100.
Lo que ya no se, si el CCS te permite dicho operador......Giño!
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
RE: Variable boolean en C
« Respuesta #4 en: 13 de Septiembre de 2005, 10:46:00 »
Si llevas razon, ese codigo equivale a este otro

void main () {
      enum boolean {false = 0, true =1};
      boolean nombre_variable;
      nombre_variable = true;
     
      if (nombre_variable == true)
          nombre_variable = false;
      else
          nombre_variable = true;
}

Un saludo compañer@s Rebotado

Saludos desde Cádiz, España
Web personal: http://www.microtronic.es

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Variable boolean en C
« Respuesta #5 en: 13 de Septiembre de 2005, 11:32:00 »
Gracias compañero... estaba intentando eso mismo cuendo decía lo del typedef... se me van olvidando las cosas con el tiempo

1 saludo

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Variable boolean en C
« Respuesta #6 en: 13 de Septiembre de 2005, 11:38:00 »
Vaya...

Pegando tu código el ccs se pega una ostia esperando un {... con lo que he visto que YA existía el tipo boolean en este compilador. NI siquiera lo había probado... siesque....

Pero éte aqui que el ccs no admite array"s de bits... por lo visto

probad

boolean leds[10];

Alguna solución? o explicación q de sentido a esto?

1 saludo.

Desconectado djpalas

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 595
    • Microtronic
RE: Variable boolean en C
« Respuesta #7 en: 13 de Septiembre de 2005, 11:58:00 »
Pues no te puedo ayudar ahora mismo, porque es ahora cuando me quiero poner a programar las pic desde C, asi que por ahora no tengo el CCS y nose donde poderlo conseguir. Llorando
El codigo que te coloque es admisible para cualquier compilador de C, pero no he tenido la ocacion con el CCS.

Un saludo, y espero que soluciones el problema.

Saludos desde Cádiz, España
Web personal: http://www.microtronic.es

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: Variable boolean en C
« Respuesta #8 en: 14 de Septiembre de 2005, 00:57:00 »
¿Has probado con int1 leds[10] ?

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Variable boolean en C
« Respuesta #9 en: 14 de Septiembre de 2005, 05:25:00 »
Bien compilando con boolean led[5]; el compilador CCS dice: "Arrays of bits are not permitted" es decir, noe sta permitido los vectores de bit"s y de la manera que dice pocher: int1 led[5]; el compilador replica: " Arrays of bits are not permitted", es decir, los vectores de bit"s no estan permitidos....¿para que quieres un vector de bit"s?Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Variable boolean en C
« Respuesta #10 en: 14 de Septiembre de 2005, 05:42:00 »
Escrito originalmente por vszener
Bien compilando con boolean led[5]; el compilador CCS dice: "Arrays of bits are not permitted" es decir, noe sta permitido los vectores de bit"s y de la manera que dice pocher: int1 led[5]; el compilador replica: " Arrays of bits are not permitted", es decir, los vectores de bit"s no estan permitidos....¿para que quieres un vector de bit"s?Giño


Para guardar el estado de unos leds... encendido o apagado... no lo veo tan raro... la unicas solución es ponerle 3 estados... q remedio... 0 1 2 y sin problema...

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Variable boolean en C
« Respuesta #11 en: 14 de Septiembre de 2005, 05:51:00 »
Si esa es una solucion, otra es leer los pines donde estan conectados los led"s y almacenar su resultado en una variable int leds=0b000; por ejemplo asi, declaras una variable leds y se inicializa por ejemplo a 0, significa que los tres leds estan apagados, lees por el puerto los leds y la almacenas en la variable leds=portb; quedaria por ejemplo leds=0b101, significa que hay dos encendidos y uno apagado, y despues con la funcion bit_test puedes comprobar a la siguiente lectura si estan encendidos o apagados y modificarlos....mas lioso pero esta digamoslo en un "falso vector" todos los estados de los led, falso vector ya que en realidad es una variable que contiene un numero que coresponde al estado de los leds conectados al puerto correspondienteGiño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Variable boolean en C
« Respuesta #12 en: 14 de Septiembre de 2005, 06:04:00 »
Escrito originalmente por vszener
Si esa es una solucion, otra es leer los pines donde estan conectados los led"s y almacenar su resultado en una variable int leds=0b000; por ejemplo asi, declaras una variable leds y se inicializa por ejemplo a 0, significa que los tres leds estan apagados, lees por el puerto los leds y la almacenas en la variable leds=portb; quedaria por ejemplo leds=0b101, significa que hay dos encendidos y uno apagado, y despues con la funcion bit_test puedes comprobar a la siguiente lectura si estan encendidos o apagados y modificarlos....mas lioso pero esta digamoslo en un "falso vector" todos los estados de los led, falso vector ya que en realidad es una variable que contiene un numero que coresponde al estado de los leds conectados al puerto correspondienteGiño


A ver todo esto viene porque programando en un pic tenemos una memoria muy recortada y usar un int para guardar el estado de 3 leds pues es un derroche impresionante, porque un int necesita de 32 bits para almacenarse, en todo caso seria mejor usar un tipo byte que necesita pues 8 bits. Date cuenta que tengo que guardar el estado de 100 leds que se encienden a través de registros de desplazamientos que se deben iluminar alrededor de 50 veces por segundo para que de la impresión de continuidad por lo que necesito consultar su estado en una matriz o calcularlo de alguna manera. Intenta declarar una matriz de 100 int y verás que no entra en la memoria dle pic.

Entonces mi intención era la de guardar exclusivamente aquello que necesitaba... y lo que necesitaba era un vector de booleanos... que por lo visto el compilador no acepta.  Pero vaya lo he solucionado de otra manera y es crear un tipo enumerado de 5 estados que se corresponde con el tamaño de las columna de matrices de led que estoy usando y 20 elementos en el array que es el tamño de las filas.

1 saludo y gracias por la ayuda y el tiempo.


EDITO:


Parece ser que en ccs los tipos tienen el siguiente espacio en memoria

Especificadores de tipo:
unsigned define un número de 8 bits sin signo
unsigned int define un número de 8 bits sin signo
int define un número de 8 bits sin signo
char define un número de 8 bits sin signo
long define un número de 16 bits sin signo
long int define un número de 16 bits sin signo
signed define un número de 8 bits con signo
signed int define un número de 8 bits con signo
signed long define un número de 16 bits con signo
float define un número de 32 bits en punto flotante
short define un bit
short int define un bit

Desconectado paymer

  • PIC10
  • *
  • Mensajes: 23
RE: Variable boolean en C
« Respuesta #13 en: 18 de Septiembre de 2005, 03:55:00 »
Hola,no se si lo que te voy a decir es una tonteria o ya lo habias pensado,pero si lo que necesitas es almacenar el esado de 100  leds podrias usar un array de int8 y te llevaria solo 12,5 bytes,aunque supongo que los tendrias que tratar a base de de desplazamientos y/o operaciones logicas de bits and y or.


Desconectado kruskal

  • PIC16
  • ***
  • Mensajes: 108
RE: Variable boolean en C
« Respuesta #14 en: 20 de Septiembre de 2005, 01:26:00 »
Y has probado con una estructura mapeando los bits a mi me ha funcionado con variables de 2 a 3 bit.
Una cosa asi podria ser

struct arreglo  {
int led1 : 1;
int led2 : 1;
int led3 : 1;
int led4 : 1;
int led5 : 1;
int led6 : 1;
int led7 : 1;
int led8 : 1;
               } estado[100];

Se tiene cada variable binaria identificada por ejemplo para el primer led es;  estado[0].led1 para el segundo estado[0].led2 y asi sucesivamente.

Salud2


 

anything