Criação e Atribuição de Variáveis

Criação e Atribuição de Variáveis

Abrangência:  Disponível em builds superiores a 5.07

Variável de memória é um dos recursos mais importantes de uma linguagem.

As variáveis são áreas de memória criadas para armazenar informações utilizadas por um programa para a execução de tarefas.

Por exemplo, quando o usuário digita uma informação qualquer, como o nome de um produto em uma tela de um programa, esta informação é armazenada em uma variável de memória para posteriormente ser gravada ou impressa.

A partir do momento que uma variável é criada, não é necessário mais se referenciar ao seu conteúdo, mas ao seu nome.


O nome de uma variável é um identificador único que segue duas regras regras:


  1. Considera apenas os primeiros 10 caracteres do nome.

    O AdvPl não impede a criação de uma variável de memória cujo nome contenha mais de 10 caracteres, porém apenas os 10 primeiros serão considerados para a localização do conteúdo armazenado.
    Portanto se forem criadas duas variáveis cujos 10 primeiros caracteres forem iguais, como nTotalGeralAnual e nTotalGeralMensal, as referências a qualquer uma delas no programa resultarão o mesmo valor (serão a mesma variável).

    nTotalGeralMensal := 100
    nTotalGeralAnual  := 300
     
    Alert("Valor mensal: " + cValToChar(nTotalGeralMensal))


    Quando o conteúdo da variável nTotalGeralMensal é exibido, o seu valor será de 300. Isso acontece porque no momento que esse valor foi atribuído à variável nTotalGeralAnual, o AdvPl considerou apenas os 10 primeiros caracteres, assim como o faz quando deve exibir o valor da variável nTotalGeralMensal, ou seja, considerou-as como a mesma variável.
    Assim o valor original de 100 foi substituido pelo de 300.

  2. Restrição de caracteres aceitos para definição do nome.

    Os nomes das variáveis devem sempre começar por uma letra ou o caracter de sublinhado ( _ ). No restante, pode conter letras, números e o caracter de sublinhado. Qualquer outro caracter, incluindo espaços em branco, não são permitidos.
    O AdvPl permite a criação ilimitada de variáveis, dependendo apenas da memória disponível.

    A seguir estão alguns nomes válidos para variáveis:

    TOT01cNumeroVAR_QUALQUERM_CARGOA11


    E alguns nomes inválidos para variáveis:

    1CODIGOInicia por um número
    M CARGOContém um espaço em branco
    LOCALPalavra reservada do AdvPl


O AdvPl não é uma linguagem de tipos rígidos para variáveis, ou seja, não é necessário informar o tipo de dados que determinada variável irá assumir no momento de sua declaração e o seu tipo pode mudar durante a execução do programa de acordo com novo valor a ela atribuído que seja de um tipo distinto.

Também não há necessidade de declarar variáveis em uma seção específica do seu código fonte, embora seja aconselhável declarar todas as variáveis necessárias no começo, tornando a manutenção mais fácil e evitando a declaração de variáveis desnecessárias.

Para declarar uma variável deve-se utilizar um identificador de escopo, seguido de uma lista de variáveis separadas por vírgula (,).

Um identificador de escopo é uma palavra chave que determina a que contexto do programa a variável declarada pertence.


Alguns tipos de contexto de variáveis são:

    LOCAL   As variáveis são visualizadas apenas dentro do escopo de uma função onde foram declaradas;
    ESTÁTICO   As variáveis são visualizadas a partir de qualquer ponto do código de programa atual;
    PÚBLICO   As variaveis são visualizadas por qualquer outro programa;

Os diferentes tipos de contexto de variáveis são explicados na documentação sobre escopo de variáveis.


Uso de variável não declarada


Considere as linhas de código de exemplo a seguir:

nResultado := 250 * (1 + (nPercentual / 100))

Se esta linha for executada em um programa AdvPl, ocorrerá um erro de execução com a mensagem "variable does not exist nPercentual", pois esta variável nPercentual está sendo utilizada em uma expressão de cálculo sem ter sido declarada.


Para solucionar este erro, deve-se declarar a variável previamente da seguinte forma: 

Local nPercentual, nResultado
 
nResultado := 250 * (1 + (nPercentual / 100))


Veja que, neste exemplo, as variáveis são declaradas previamente utilizando o identificador de escopo local.

Quando a linha de cálculo for executada, o erro de variável não existente não ocorrerá novamente, porém, variáveis não inicializadas tem sempre o valor padrão nulo (Nil), e este valor nulo não pode ser utilizado em um cálculo pois também gerará erros de execução, visto que o valor nulo não pode ser dividido por 100.


Para resolver este problema basta inicializar a variável através de uma das formas a seguir:

EXEMPLO 1 - Via atribuição exclusiva antes do uso do seu valor em uma expressão
Local nPercentual, nResultado
 
nPercentual := 10
nResultado := 250 * (1 + (nPercentual / 100))
EXEMPLO 2 - Atribuição de um valor padrão (valor inicial), na mesma linha de sua declaração
Local nPercentual := 10, nResultado
 
nResultado := 250 * (1 + (nPercentual / 100))
EXEMPLO 3 - Através da instrução Store que determina um novo valor
Local nPercentual,nResultado
 
Store 10 To nPercentual
nResultado := 250 * (1 + (nPercentual / 100))
ATENÇÃO! O comando store é obsoleto, mas existe apenas por compatibilidade com versões anteriores e outras linguagens como xBase.

A diferença entre o EXEMPLO 2 e os demais é que a variável é inicializada no momento da sua declaração.
Nos EXEMPLO 1 e no EXEMPLO 3, a variável inicialmente é declarada e então é inicializada em uma outra linha de código.

Deve-se utilizar o operador de atribuição := (sinal de dois pontos e seguido do sinal igual) ou somente (sinal igual).


Importante

É aconselhável optar pelo operador de atribuição composto de dois pontos e sinal de igual, pois o operador de atribuição utilizando somente o sinal de igual pode ser facilmente confundido com o operador relacional (para comparação) durante a criação do programa.



Redeclaração de variável 


EXEMPLO 1
FUNCTION declaracaoVariavel(cFile)
    Local cFileAux := cFile := alltrim(cFile)
 
    conout(cFileAux)
RETURN cFile

ATENÇÃO! Ao compilar o código acima, o compilador apresentará a seguinte mensagem de alerta (Warning): "W0011 Variable CFILE redefined". Neste caso, a variável cFile inicialmente já é declarada como local por estar definida na lista de parâmetros da função e posteriormente é redeclarada na linha de declaração da variável Local cFileAux, pois na linha da instrução Local o sinal de atribuição após o nome da variável cFile (cFile := <valor>).


EXEMPLO 2
FUNCTION declaracaoVariavel(cFile)
    Local cFileAux := (cFile := alltrim(cFile))
 
    conout(cFileAux)
RETURN cFile

Para resolver a mensagem de Warning apresentada durante a compilação do EXEMPLO 1, veja que no EXEMPLO 2, a variável cFileAux assumirá o resultado de uma expressão que está entre parênteses (cFile := alltrim(cFile)).


Importante

Vale lembrar que cFile receberá o resultado de alltrim(cFile), somente durante a execução desta função, onde após sua finalização, cFile voltará a ter o valor original a ela definido.


Mudança de tipo de uma variável


Uma vez que um valor seja atribuído a uma varíavel, o seu tipo de dado passa a ser do tipo de dado do valor atribuído, ou seja, uma variável passa a ser numérica se for atribuído um número, ou passa a ser caractere se for atribuído um conteúdo texto, e assim por diante. Desta forma uma variável com um determinado tipo de dado, pode mudar de tipo apenas atribuindo um valor de outro tipo a ela como nos exemplos a seguir:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Function MudarTipoVariavel()
 Local xVariavel // Declara a variável inicialmente com valor nulo (Sem definição de tipo)
  
 xVariavel := "Agora a variável é caracter..."
 Alert("Valor do Texto: " + xVariavel)
  
 xVariavel := 22 // Agora a variável é numérica
 Alert("Valor do Número: " + cValToChar(xVariavel))
 
 xVariavel := .T. // Agora a variável é lógica
 If xVariavel
    Alert("A variável tem valor verdadeiro...")
 Else
    Alert("A variável tem valor falso...")
 Endif
 
 xVariavel := Date() // Agora a variável é data
 Alert("Hoje é: " + DtoC(xVariavel))
  
 xVariavel := nil // Nulo novamente
 Alert("Valor nulo: " + xVariavel)
Return


Veja que neste exemplo acima a variavel xVariavel é utilizada para armazenar tipos de dados distintos. A letra "x" em minúsculo no começo do nome da variável é utilizada apenas para indicar que uma variável pode assumir diversos tipos de dados, segundo a Notação Húngara (consulte documentação específica para mais detalhes).


Este código acima troca o valor da variável diversas vezes e exibe seu conteúdo para o usuário através da função Alert() que recebe um parâmetro que deve ser do tipo string de caracteres e por isso, dependendo do tipo de dado da variável xVariavel, pode ser necessário fazer uma conversão do tipo antes.

Apesar da flexibilidade no uso das variáveis, deve-se tomar cuidados na passagem de parâmetros para funções, comandos, concatenação ou soma de valores.


Note que quando a linha 21 do código é executada, a variável xVariavel terá o valor nulo (Nil) e com isso a tentativa de concatenação de tipos de dados diferentes gera erro de execução ("Valor nulo: " + xVariavel) onde trata-se de um TEXTO + NULO. Nesta linha do exemplo, ocorrerá um erro com a mensagem "type mismatch on +".

Com exceção do valor nulo, para os demais tipos de dados deve-se sempre utilizar funções de conversão quando houver necessidade de concatenar tipos de dados diferentes, por exemplo, nas linhas 08 e 18, onde foi feita a conversão do tipo para caracter usando a função cValToChar().


Note também que uma variável do tipo de dado lógico pode ser utilizada diretamente em uma expressão condicional IF, conforme está na linha 11:

If xVariavel


A expressão condicional acima é equivalente a:
If xVariavel = .T.



A declaração de variáveis para os demais tipos de dados, matrizes e blocos de código, é exatamente igual ao descrito até agora, apenas existem algumas diferenças quanto a inicialização, que podem ser consultadas na documentação de inicialização de matrizes blocos de código.


Atualizado em 18/05/2023
Este artigo foi útil?  
Agradecemos sua avaliação.