Página 1 de 2
Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
11 Dez 2016 15:51
por Vonnilmam
Pessoal, tenho uma dúvida e preciso da ajuda de vocês.
É o seguinte, no meu aprendizado em C (uso o mikroc pro pic), estou programando o pic18f4520.
Vi que declarar variáveis GLOBAL, não muito aconselhavel e que o ideal é sempre fazer declarações LOCAIS...Até agora não entendi muito bem, o do porque disso, mas estou querendo aprender e o melhor é seguir o padrão.
Bom, vamos lá, se eu declarar uma variável dentro de uma macro (acho que o nome certo é protótipo!):
- Código: Selecionar todos
voide delay_vonnilmam() {
unsigned char xxx;
unsigned char txt[8];
}
Esse trecho é considerado LOCAL ou GLOBAL?
Obrigado
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
11 Dez 2016 16:04
por andre_luis
o ideal é sempre fazer declarações LOCAIS...Até agora não entendi muito bem, o do porque disso
Uma variavél que será utilizada somente uma vez, ou seja, cujo conteúdo não importa mais depois que ela compriu sua função, se for declarada como local, o espaço que ela ocupa será liberado, tornando um recurso posteriormente disponivel para o microcontrolador. Entenda como variaveis, ás posições de memórias que nós apelidamos com nomes sugestivos, mas que nao passam de endereços de memória RAM.'
Esse trecho é considerado LOCAL ou GLOBAL?
As variaveis contidas nesse trcho são locais, pois uma vez instanciado a função, após sua execução, o espaço que foi necessário alocar para elas, foi liberado pelo compilador para o programa decidir colocar qualquer outro conteúdo dentro desse endereço, que se instanciado em outra função, será certamente ocupado por uma outra variavel local.
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
11 Dez 2016 19:14
por Vonnilmam
Entendi andre, então uma variável local é uma posição de RAM que pode ser reescrita novamente por outros trechos do programa, é tipo um rascunho comum, "quem precisar usar usa naquele instante", correto.
Agora eu estou tentando entender como fazer para utilizar uma posição de RAM de forma GLOBAL e essa posição não pode ser "borrada" por outro trecho da rotina, como eu faço isso.
Trocando em miudos, em uma rotina eu vou precisar utilizar variáveis globais, como eu faço para fazer isso da forma correta. Essa é minha dúvida.
Obrigado
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
11 Dez 2016 19:49
por andre_luis
Vonnilmam escreveu:Agora eu estou tentando entender como fazer para utilizar uma posição de RAM de forma GLOBAL e essa posição não pode ser "borrada" por outro trecho da rotina, como eu faço isso
Simples, é só declarar fora da função MAIN(), lá proximo do cabeçalho, após os #includes.
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
11 Dez 2016 20:18
por Vonnilmam
Oi, andre
Eu sei disso, já aprendi a criar o cabeçalho...sem problemas.
O que eu estou referindo é o fato que muitos dizem que é bom evitar declarações globais e procurar fazer declarações locais de variáveis, é isso que eu não entendi.
Por isso perguntei como vocês declaram variáveis globais, sendo que não é indicado fazer isso...segundo eu entendi em posts anteriores, e em livros, etc...não é recomendado, então como vocês fazem para declarar variáveis que serão utilizadas em varias partes do programa e a declaração local é insuficiente para atender essa meta global...
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
11 Dez 2016 20:39
por eletroinf
A ideia de evitar variaveis globais, além do que foi comentado a respeito de não ficar ocupando memória desnecessariamente, é para evitar erros de programação. Sendo a variável global, ela pode ser acessada em qualquer parte de programa, o que a torna vulnerável a modificações indevidas.
Imagine um programa extenso... fica fácil de se verificar a possibilidade de estar mexendo na variável em algum trecho que não deveria.
A solução para isso (uma delas, depende em cada caso!) é declarar sua variável no main(), passar ela para a função que tu chamar e obter o retorno.
Exemplo:
main()
{
int x;
x = func_modif_x(x);
...
}
Assim, a tua variável está retida no main e só é modificada pela função para a qual tu passa ela.
É um exemplo, apenas, com o intuito de dar uma ideia da coisa.
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
11 Dez 2016 21:48
por xultz
Vonnilmann, uma vantagem enorme de se utilizar variáveis locais é poder usar variáveis de mesmo nome em funções diferentes, e uma não interferir na outra.
Por exemplo, eu crio um função A e dentro dela declaro uma variável x. Depois crio uma função B e dentro eu também declaro uma variável x. Um x não tem nada a ver com o outro x.
A programação estruturada, que é o caso da linguagem C, tem essa premissa: você cria blocos de código que executam uma tarefa específica (que é uma função), que (opcionalmente) recebem variáveis de parâmetros, e (opcionalmente) retorna uma variável de resultado.
Dessa forma, para um código que está fora de uma função, tudo que está ali dentro é uma caixa-preta: o código dentro da função e suas variáveis são completamente desconhecidas, o código só sabe que passa alguns parâmetros e recebe um retorno. Então se eu tiver dezenas de funções e todas tiverem variáveis com mesmo nome, não vai dar nenhum problema, porque o código e as variáveis ficam ali enclausuradas. Isso possibilita, por exemplo, que várias pessoas trabalhem num mesmo código, com pouca interação entre elas. Suponha o seguinte, você está fazendo um programa, e precisa calcular as raízes de uma função de segundo grau utilizando a famosa fórmula de Bhaskara. Mas você decide passar esta tarefa para outra pessoa. Aí você chega pro colega e diz "cara, programa aí uma função que calcula as raízes com o Bhaskara. Eu vou passar três variáveis float que representam, na ordem, os valores A, B e C da equação de segundo grau, e me retorne como um float a raíz positiva. Depois faça uma função que retorne a raiz negativa. Chame a primeira função de raiz_positiva e a segunda de raiz_negativa". Isso que você especificou é um protótipo e podemos chamar de
float raiz_positiva(float, float, float);
float raiz_negativa(float, float, float);
Depois que teu colega terminar este trabalho hercúleo, você não precisa se preocupar com os nomes de variáveis que ele está usando para fazer esse trabalho, porque prá você, o código dentro da função pode ser uma caixa-preta. Se funciona, você nem precisa olhar como ela funciona.
Imagine o pior caso possível, que é o kernel Linux. O Linux, que é feito em C, tem muitas milhões de linhas de código (é sério), e muitas milhares de funções. E zilhões de variáveis prá fazer tudo quanto é tipo de trabalho. Consegue imaginar o serviço de corno que seria ter que gerenciar todas as variáveis, garantir que nunca tenham o mesmo nome, se fossem todas globais?
Então assim: usar variáveis locais é uma boa prática programação. Usar variáveis globais não é pecado, não é errado, mas devem ser utilizadas somente quando realmente forem necessárias, que é o caso de um valor que deve ser acessado por duas funções diferentes. O caso mais comum de se usar variáveis globais é dentro de ISR (que são as rotinas de tratamento de interrupção). Uma ISR é uma função que não recebe parâmetros e não retorna nada, porque ela é executada quando uma interrupção ocorre, não porque alguém solicitou. Assim, é bem comum, por exemplo, escrever uma ISR que trate o recebimento de um caracter pela porta serial. E por meio de uma variável global, informar à main que chegou um caracter, e por meio de outra global, armazenar este caracter.
Me fiz entender?
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
11 Dez 2016 22:06
por andre_luis
Vonnilmam escreveu:O que eu estou referindo é o fato que muitos dizem que é bom evitar declarações globais e procurar fazer declarações locais de variáveis, é isso que eu não entendi
Se voce quizer ser dogmatico, use semáforo para controlar o acesso de escrita á essas variaveis globais. Mas via de regra, num programa mesmo de complexidade média, se bem programado, podemos confiar no nosso taco e nao complicar as coisas.
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
12 Dez 2016 01:38
por Vonnilmam
Agora eu entendi.
Minha dúvida era extamente essa: "É PECADO UTILIZAR VARIÁVEIS GLOBAIS", pelo que li até agora no meu aprendizado do mundo C, fiquei com essa pulga atrás da orelha, PORQUE NÃO RECOMENDAVA-SE UTILIZAR VARIAVEIS GLOBAIS?
Agora entendi, não que seja "errado" utilizar globais, isso é indicado para não confundir o meio de campo...porém posso utiliza-las caso haja necessidade, como o caso sitado das ISRs, justamente, eu estava pensando era nisso, e se fosse necessário utilizar ISR, como faria?
Há entendi...
Muito obrigado,
Só uma dúvidinha amais...Como vocês sabem estou treinando mentalmente para entrar no mundo 32 bits arm, eu tenho o compilador mikroc arm, minha pergunta é, tem algum programa que envia/grava o STM (vou utilizar o kit STM32F0DISCOVERY), tipo igual o "Flash magic da NXP".
Eu tô precisando de dicas, para iniciar, tô com muita informação mas sem um rumo correto a tomar, entendem.
Obrigado
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
12 Dez 2016 06:57
por EDSONCAN
Deixe eu defender um pouco as variáveis globais, quando você já projetou um compilador de dois passos as variáveis locais são um pé no saco pois é difícil para o compilador avaliar quanta memoria vai ser usada, elas são instanciadas nos momento do uso....
Para um compilador é mais fácil usar variáveis globais pois a posição de memoria já é reservada na compilação.... Portanto muitos bugs de programa podem ocorrer e vão ter deixar maluco para encontra-los, principalmente em linguagem de alto nível.......
Imagine um buffer grande local em um processador sem muita memoria sobrando, como você ira alocar isso se a memoria não tiver segmento livre suficiente, para o mesmo, se usar RTOS fica pior pois não vai saber quem esta rodando junto e quanta memoria esta usando.....
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
12 Dez 2016 11:24
por Vonnilmam
Amigo, Edson, (obrigado pela contribuição), mas clareia melhor o que disse, eu fiquei confuso.
O que é que é ruim? É usar globais ou locais! Não ficou claro para eu entender.
Quando você disse sobre como o compilador entende as coisas!
Obrigado
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
12 Dez 2016 11:55
por andre_luis
Refraseando o que o Edson disse:
Ou voce confia no seu taco, ou confia no taco do compilador
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
12 Dez 2016 15:53
por Vonnilmam
Vixxiiii
Se eu entendi, então não tem BUG nos compiladores de uma forma geral, quando se refere ao declarações globais. Eu posso utilizar declarações globais então, pois se o caso é confiar no meu "taco", entendo que querem dizer se eu souber o que estou fazendo com as variáveis e tiver a atenção necessária para lidar com elas, tanto faz se eu declarar LOCAL ou GLOBAL,
Entendi que o fato de declarar GLOBAL não irá gerar problemas para o compilador, e o problema poderia sim, ser gerado é pelo programador...
Obrigado
Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
12 Dez 2016 15:56
por Vonnilmam
E tem outra,
Agora eu sou ARM, kkk
Já tô começando a entender esses bichinhos de 32 bits, "começando", ainda tem muito chão pela frente.
Mas uma coisa é certa, estou começando a entender da forma certa, agora já baixei um monte de material da ST, vou estudar com calma e darei um grito de socorro se precisar de ajuda.
Muito obrigado pelas valiosas dicas.
VIVA o "C"....nunca pensei em falar isso...não deixem o ASM ouvir isso...

Re: Dúvida sobre variavel LOCAL e GLOBAL

Enviado:
12 Dez 2016 18:57
por Maffeis
Cara talvez te deixe com mais duvidas ainda ou talvez te ajude com alguma coisa
https://www.dropbox.com/s/vitwlldqhx7oh ... s.pdf?dl=0