Jump to content
XtApOr

Array Booleano

Recommended Posts

XtApOr

Boas,

alguém sabe se é possível criar um Array Booleano (para poupar memória) ou outra forma alternativa?

Cumprimentos

Share this post


Link to post
Share on other sites
bubulindo

O C, não tem o tipo de variável binária (bool, boolean, bit). Então, a única maneira possível de criar um array de bits é através de variáveis normais.

Um char é um array de 8 bits.

Um int é um array de 16 bits

Um long é um array de 32 bits e por aí fora. (Estes valores são dependentes da máquina e compilador, mas não devem ser muito diferentes do que aqui coloquei)

Imaginando, por exemplo um array de 8 bits podes fazer algo assim:

#define SetB(PORT, BIT)		((PORT) |= 1<< (BIT))
#define ClrB(PORT, BIT)		((PORT) &= 1<< (BIT))
#define TogB(PORT, BIT)		((PORT) ^= 1<< (BIT))
#define TestB(PORT, BIT) 	                ((PORT) & (1<<BIT))

PORT seria a tua variável (int, char, long) que estava a fazer de array e BIT era o bit que querias limpar, atribuir um, inverter ou testar.

Existem compiladores para microcontroladores que permitem utilizar algo como:

char teste; 
//colocar a variável teste com o valor 5
teste=0;
teste.0 = 1; 
teste.2 = 1;  

No entanto, isto é feito para facilitar a utilizacão dos pinos de saída do controlador e não para arrays de boolean.

Experimenta. Pretendias isto para algo em grande ou para um processador de baixo nível?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Localhost

Atenção que existe o header stdbool.h que define isso tudo.


here since 2009

Share this post


Link to post
Share on other sites
bubulindo

Ups...

Parece que me enganei... LOL


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
XtApOr

O C, não tem o tipo de variável binária (bool, boolean, bit). Então, a única maneira possível de criar um array de bits é através de variáveis normais.

Um char é um array de 8 bits.

Um int é um array de 16 bits

Um long é um array de 32 bits e por aí fora. (Estes valores são dependentes da máquina e compilador, mas não devem ser muito diferentes do que aqui coloquei)

Imaginando, por exemplo um array de 8 bits podes fazer algo assim:

#define SetB(PORT, BIT)		((PORT) |= 1<< (BIT))
#define ClrB(PORT, BIT)		((PORT) &= 1<< (BIT))
#define TogB(PORT, BIT)		((PORT) ^= 1<< (BIT))
#define TestB(PORT, BIT) 	                ((PORT) & (1<<BIT))

PORT seria a tua variável (int, char, long) que estava a fazer de array e BIT era o bit que querias limpar, atribuir um, inverter ou testar.

Existem compiladores para microcontroladores que permitem utilizar algo como:

char teste; 
//colocar a variável teste com o valor 5
teste=0;
teste.0 = 1; 
teste.2 = 1;  

No entanto, isto é feito para facilitar a utilizacão dos pinos de saída do controlador e não para arrays de boolean.

Experimenta. Pretendias isto para algo em grande ou para um processador de baixo nível?

Boas, obrigado pela resposta :cheesygrin:

Por acaso também pensei assim, só que preciso de poupar o máximo de espaço que posso usar do microcontrolador, pois é curto

Share this post


Link to post
Share on other sites
XtApOr

Atenção que existe o header stdbool.h que define isso tudo.

Boas, obrigado pela resposta :)

Acho que isso me pode ajudar imenso. No entanto, já tentei sem sucesso o seguinte:

#include <stdbool.h>

.

.

boolean temp = false;

//---------------------------

e deu erro :s

Consegues ajudar-me?

Obrigado :cheesygrin:

Share this post


Link to post
Share on other sites
bubulindo

Boas, obrigado pela resposta :)

Por acaso também pensei assim, só que preciso de poupar o máximo de espaço que posso usar do microcontrolador, pois é curto

Qual microcontrolador e qual compilador?

Se for um PIC, coloca a dúvida no sub-fórum de electrónica que o perito residente em PICs (asena) certamente que ajudará.

Se for um AVR, ou x51 provavelmente poderei ajudar-te, mas colocar (pede ao moderador) o tópico no sub-fórum de electrónica vai ajudar-te muito mais. :cheesygrin:

Duvido que haja um microcontrolador com o stdbool.h implementado. Mas podes implementar um header dessee género... nem que seja para ter os defines que coloquei no post anterior. :)


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
bubulindo

XtApOr: Talvez seja melhor veres a documentação do header e já percebes o erro. stdbool.h - Open Group.org.

Seguindo isso ficava:

#include <stdbool.h>

bool temp = false;

Olha... aprendi algo hoje. :cheesygrin:


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Surtr

Podes também usar bitfields para definir isso, uma vez que a variável só tem 2 valores possível (0 e 1), só irás precisar de 1 bit.


#define FALSE 0
#define TRUE 1
typedef struct bool {
      unsigned int val:1;
}Bool;

A variável val só ocupa 1 bit.

Share this post


Link to post
Share on other sites
Localhost

Surtr: Realmente é muito mais prático ter de definir tudo à mão e depois utilizar essa definição do que apenas incluir um header que já tem tudo definido.

/irony


here since 2009

Share this post


Link to post
Share on other sites
Surtr

Surtr: Realmente é muito mais prático ter de definir tudo à mão e depois utilizar essa definição do que apenas incluir um header que já tem tudo definido.

/irony

lol. É menos prático, mas pode ser a melhor solução. Se estás a programar para um micro-controlador quanto menos headers melhor. E includes a torto e a direito começam a levantar a questão da portabilidade.

Share this post


Link to post
Share on other sites
bubulindo

lol. É menos prático, mas pode ser a melhor solução. Se estás a programar para um micro-controlador quanto menos headers melhor. E includes a torto e a direito começam a levantar a questão da portabilidade.

Ora aqui está uma boa questão... isto é para microcontroladores. E da mesma maneira que alguns aceitam o "." para aceder a um bit duma variável, outros não...

Daí ser sempre melhor fazer uso das funcões mais básicas do C para não cair em problemas de portabilidade. Para teres uma ideia, é rara a aplicacão de microcontroladores que use um printf...


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.