Bom dia Pessoal.

Já me deparei com vários sketches que é usado o #define e ou o int para declarar variáveis, tal como o exemplo abaixo;

#define sensor  3

void setup {

 pinMode(sensor, INPUT);

}

e

int sensor = 3;

void setup {

 pinMode(sensor, INPUT);

}

Na prática não vi diferenças. Alguém aqui pode dizer qual a vantagem de usar um ou outro ?

Abraços e boa semana a todos.

Att.:Reinaldo de Souza

Exibições: 1194

Responder esta

Respostas a este tópico

Olá.

  O #define cria associa a "palavra" 'sensor' o valor 3, assim sempre que vc citar 'sensor'.

  Isso gasta 0 bytes de memória RAM e 0 bytes de memória ROM, pq a troca da palavra pelo numero é feita ainda nas primeiras passadas do compilador (pré-processador), quando ele está analisando. (isso tem uma linda explicação para quem se lembra das aulas (não é meu caso), vou ver se acho um link).

  O int cria uma variável na memória RAM e atribui a essa variável o valor 3.

  Gera esses passos de execução (desprezível) e ocupa memória RAM. De 2 a 4 bytes (depende do microcontrolador).

  Cada vez que se acessa ele busca na RAM o valor atual (demora mais).

  Enfim, para programas curtos e não críticos tanto faz, mas é regra de engenharia ser econômico, assim como diretivas de otimização te levariam sempre a:

  - Use #define para tudo que tiver valor fixo durante a execução do programa. Variável é coisa que varia, se não varia use #define.

   

Link:
   http://tics.ifsul.edu.br/matriz/conteudo/disciplinas/proe/ua/1/3.html

   Repare que o primeiro passo é o pré processador, que é onde os #define são tratados. Depois dele sua palavra "sensor" é apenas "3".

  

Olá, Reinaldo!

   Citando o Eduardo :"Use #define para tudo que tiver valor fixo durante a execução do programa. Variável é coisa que varia, se não varia use #define."

   E complementando. Hoje em dia, os compiladores são bastante "espertos". Se você usar int, que normalmente é utilizado para se definir variáveis, mas não alterar o valor deste "int" durante todo o programa, o compilador o trata como um "#define" e não vai haver nenhuma diferença.

   Eu prefiro usar, por exemplo para definições de pinos que não vão se alterar, o "#define", que deixa claro que aquilo é uma constante. Não quer dizer que você não possa alterar a definição de um pino ao longo do programa, tanto usando o "#define" quanto o "int". Se bem que nunca precisei fazer isto.   :-)

   IMHO, é uma questão de estilo, mas programar é também uma técnica de transmitir informações. Quanto mais clara a linguagem utilizada, mais facilmente se entende o programa.

   Não esqueça daquele ditado que diz que "Qualquer programa que você escreveu há seis meses ou mais pode muito bem ter sido escrito por outra pessoa"

   Espero ter ajudado.

D. T. Ribeiro

Bom dia, 

Não use define - recomendação do Arduino.

https://www.arduino.cc/reference/en/language/structure/further-synt...

Em geral, a constpalavra-chave é preferida para definir constantes e deve ser usada em vez de #define.

Olá Gustavo!

   A recomendação do Arduino se deve ao fato de que, em geral, a IDE é utilizada por principiantes e, neste caso, realmente, se não souber fazer a inclusão de um símbolo definido dentro de outro, haverá muitos problemas, já que a substituição é literal.

   Entretanto, permita-me discordar do seu conselho.

   Em primeiro lugar, me pareceu um tanto imperativo, "Não use...", não seria melhor escrever "Olha, a recomendação do Arduino é para não usar ..."? 

   Além disso, acho que todos tem o direito de evoluir, começar como principiante e ir agregando experiência até tornar-se um profissional. Profissionais usam #define e não tem problemas, porque já entenderam perfeitamente como funciona. Aliás usam #define até para definir funções, que desta forma são chamadas de "macro". O próprio compilador C/C++ está cheio delas e, acredite ou não, foi escrito por profissionais.

   Faz já quase 30 anos que escrevo software embarcado em C e, mais recentemente, C++. Desde o início uso #define. Não me lembro de ter escrito um programa que não tenha. Estes programas estão a bordo de muitos produtos sendo vendidos no mercado e, se é verdade que não existe software sem bugs, até hoje nenhum bug detectado nestes softwares foi causado por um #define.

   Como regra geral de programação, uso um subconjunto da regras da MISRA, junto com um texto fantástico do Jacob Beningo sobre bons hábitos de programação. Não lembro de ter visto, em nenhum deles, a recomendação para não usar #define, mas posso estar enganado. Vou conferir.

   Por último, mas não menos importante, não é suficiente apenas ler as recomendações, mas entender sua contextualização.

Saudações!

D. T. Ribeiro.

Boa noite DT, 

A recomendação não é minha. É da organização Arduino. 

Olha o que está escrito no link - o motivo de não usar define.Acho que você não leu...

https://www.arduino.cc/reference/en/language/structure/further-synt...

"#define é um componente C++ útil que permite ao programador dar um nome a um valor constante antes que o programa seja compilado. Constantes definidas no arduino não ocupam espaço de memória de programa no chip. O compilador substituirá as referências a essas constantes pelo valor definido em tempo de compilação.

Isso pode ter alguns efeitos colaterais indesejados se, por exemplo, um nome de constante que foi #definido for incluído em alguma outra constante ou nome de variável. Nesse caso, o texto seria substituído pelo número (ou texto) #definido.

Em geral, a const palavra-chave é preferida para definir constantes e deve ser usada em vez de #define."

Olá, Gustavo!

   Li, sim.

   Você é que não entendeu o que escrevi. Ou não leu.

D. T. Ribeiro.

Bom dia a todos,

recentemente tive acesso à um Starter Kit Arduino, que foi comprando este mês.

Encontrei diversos erros no manual que acompanha o KIT (Mais nova edição do Arduino Projects Book).

Não concordo com o uso do tipo int para definir os pinos do arduino, afinal, int é para variáveis, além

de usar 2 bytes na memoria do arduino  e pinos do arduino não são variáveis.

Nunca são negativo.

Se por acaso, durante a execução, quiser usar outro pino com o mesmo nome, então crie uma variável

usando byte, (Ocupa um byte somente) ,  mas nunca tentei este recurso.

Terá também que usar o método pinMode() novamente. Parece um pouco complicado

Veja este projeto que também faz parte do livro do kit?

Tem uma redefinição de uma matriz, e que a matriz nem é usada no projeto Keyboard Instrument .

Piano_StarterKit.ino

Também encontrei no kit um projeto que utiliza o MOSFET IRF520.

O MOSFET IRF520 não se encaixa na categoria de MOSFETs para níveis lógicos.

No fórum do arduino, existe diversos tópicos criticando ou uso de MOSFET de nível não logico em

projetos de nível logico.

Dentre outros problemas que já identifiquei com o "C do arduino",

um é que ele aceita que a função seja escrita depois de ser chamada, mesmo sem a necessidade

de protipagem da função.

Então o que percebi é que o arduino (site) é quase um "wikiArduino" .

RV mineirin

Olá, Grande RV.

   Não sabia disto, mas não me surpreendo.

   Isto não tira, entretanto, o brilho da ideia, de possibilitar o uso de eletrônica embarcada por pessoas com pouco conhecimento.

   Pessoas estas que, com senso crítico, podem evoluir e acabar tornando-se até, profissionais da área, o que é muito positivo para todo mundo.

   Este teu alerta, entretanto, não só vem em boa hora, como também reveste-se de suma importância para que as pessoas abram a suas mentes e procurem informar-se em mais de uma fonte de conhecimento, pois nenhuma é perfeita.

   Ah, já ia esquecendo, e não esqueçam de contextualizar as informações.

Grande abraço!

D. T. Ribeiro.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço