Este é o site histórico da documentação 4D. As documentações estão sendo movidas progressivamente para developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20.6
Usar Diretivas de Compilador
|
Booleano |
Alfanumérico (ou cadeia fixa) |
Data |
Inteiro |
Inteiro longo |
Gráfico |
Hora |
Imagem |
Número (o Real) |
Ponteiro |
Texto |
BLOB |
Objeto |
Collection |
Variant |
Para as variáveis de tipo Array, dispõem dos seguintes tipos:
Abaixo os diferentes tipos de arrays
Array Booleano |
Array Data |
Array Inteiro |
Array Inteiro longo |
Array Imagem |
Array Real |
Array Hora |
Array Objeto |
Array Ponteiro |
Array BLOB |
Array Texto |
Notas:
- O tipo "objeto" está disponível a partir de 4D v14.
- O tipo "coleção" está disponível a partir de 4D v16 R4.
- O tipo "Variant" está disponível a partir de 4D v18.
- Os tipos anteriores Alfa (string de tamanho fixo) e Inteiro não se usam mais para as variáveis. No código existente, säo redigidas automaticamente aos tipo Texto e Inteiro Longo.
Em modo interpretado, uma variável pode ter mais de um tipo de dados. Isso é possível porque o código é interpretado e não compilado. 4D interpreta cada instrução separadamente, e compreende o seu contexto. Quando você trabalha em um ambiente de compilação, a situação é diferente. Embora a interpretação é realizada linha por linha, o processo de compilação olha para um banco de dados na sua totalidade.
A abordagem do compilador é a seguinte:
Se o compilador vem através do mesmo nome de variável e dois tipos de dados diferentes, não há nenhuma razão para favorecer qualquer um em particular. Em outras palavras, para um tipo de objeto e dar-lhe um endereço de memória, o compilador deve saber a identidade exata daquele objeto (ou seja, o seu nome e tipo de dados). O compilador determina o tamanho do tipo de dados. Para cada banco de dados compilado, o compilador cria um mapa que relaciona, para cada variável, o seu nome (ou identificador), a sua localização (ou endereço de memória), e o espaço que ocupa (indicado pelo seu tipo de dados). Este mapa é chamado de tabela de símbolos. Uma opção em Preferências permite que você escolha se deseja gerar esta tabela na forma de um arquivo durante a compilação.
Este mapa é também utilizado para a geração automática dos métodos de compilação.
Se você quiser que o compilador verifique a digitação de suas variáveis ou digitá-las em si, é fácil colocar uma diretiva de compilador para essa finalidade. Você pode escolher entre duas possibilidades diferentes, dependendo do seu método de trabalho:
Quando as variáveis são digitadas por meio de uma diretiva de compilador, recebem um valor padrão, que elas vão manter durante a sessão desde que não tenham sido atribuídas.
O valor padrão depende do tipo de variável e categoria, o seu contexto de execução (interpretada ou compilada), bem como, para o modo compilado, as opções de compilação definidas em DOM Append XML child node das configurações de banco de dados:
.
A tabela a seguir ilustra esses valores padrão:
Tipo | Interprocesso | Processo | Interpretada Localmente | Compilada localmente "a zero" | Compilada localmente "aleatório" | Compilada localmente "não" |
Booleen | False | False | False | False | True | True (varies) |
Date | 00-00-00 | 00-00-00 | 00-00-00 | 00-00-00 | 00-00-00 | 00-00-00 |
Longint | 0 | 0 | 0 | 0 | 1919382119 | 909540880 (varies) |
Graph | 0 | 0 | 0 | 0 | 1919382119 | 775946656 (varies) |
Time | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 533161:41:59 | 249345:34:24 (varies) |
Picture | picture size=0 | picture size=0 | picture size=0 | picture size=0 | picture size=0 | picture size=0 |
Real | 0 | 0 | 0 | 0 | 1.250753659382e+243 | 1.972748538022e-217 (varies) |
Pointer | Nil=true | Nil=true | Nil=true | Nil=true | Nil=true | Nil=true |
Text | "" | "" | "" | "" | "" | "" |
Blob | Blob size=0 | Blob size=0 | Blob size=0 | Blob size=0 | Blob size=0 | Blob size=0 |
Object | undefined | undefined | undefined | undefined | undefined | undefined |
Collection | null | null | null | null | null | null |
Variant | undefined | undefined | undefined | undefined | undefined | undefined |
Diretivas do compilador são úteis em dois casos:
• O compilador é incapaz de determinar o tipo de dados de uma variável de seu contexto,
• Você não quer que o compilador determine o tipo de uma variável para sua utilização.
Além disso, usar diretivas de compilador permite reduzir o tempo de compilação.
Às vezes o compilador não pode determinar o tipo de dados de uma variável. Sempre que não pode fazer uma determinação, o compilador gera uma mensagem de erro apropriada.
Existem três principais causas que impedem o compilador de determinar o tipo de dados: vários tipos de dados, a ambigüidade em uma dedução forçada e a impossibilidade de determinar um tipo de dados.
no método A,
Variable:=True
no método B,
Variable:="A lua é verde"
Se o método A é compilado antes o método B, o compilador considera a declaração Variável: = "A lua é verde" como uma mudança de tipo de dados em uma variável anteriormente encontrada. O compilador avisa que uma redefinição de tipo ocorreu. Ele gera um erro para você corrigir. Na maioria dos casos, o problema pode ser corrigido por renomear a segunda ocorrência da variável.
Case of
:(FORM Event=On Load)
MieuPopUp:=2
...
End case
Neste caso, a ambigüidade aparece - quando os métodos de análise, o compilador irá inferir um tipo de dados reais para o objeto MyPopUp. Neste caso, é necessário declarar explicitamente o array no método de formulário ou em um método de compilador:
Case of
:(FORM Event=On Load)
ARRAY TEXT(MiPopUp;2)
MeuPopUp:=2
...
End case
• Incapacidade de determinar um tipo de dados
Este caso pode surgir quando uma variável é usada sem ter sido declarada, dentro de um contexto que não fornecem informações sobre o tipo de dados. Aqui, só uma diretiva do compilador pode guiar o compilador.
Este fenômeno ocorre principalmente nos quatro contextos:
- quando os ponteiros são usados,
- quando você usa um comando com mais de uma sintaxe,
- quando você usar um comando com parâmetros opcionais ou diferentes tipos de dados,
- quando você usa um método 4D chamado através de uma URL.
- Ponteiros
Um ponteiro não pode esperar para retornar um tipo de dados que não sejam seus.
Considere a seguinte seqüência:
Var1:=5.2 //(1)
Ponteiro:=->Var1 //(2)
Var2:=Ponteiro-> //(3)
Embora (2) define o tipo de variável apontada pelo ponteiro, o tipo de Var2 não está determinada. Durante a compilação, o compilador pode reconhecer um ponteiro, mas não tem como saber que tipo de variável ele está apontando. Portanto, você não pode deduzir o tipo de dados Var2. Uma diretiva de compilador é necessária, por exemplo C_REAL (var2).
- Comandos Multi-sintaxe
Quando você usa uma variável associada com a função de Year of, a variável só pode ser do tipo de dados Date, considerando a natureza desta função. No entanto, as coisas nem sempre são tão simples. Aqui está um exemplo:
O comando GET FIELD PROPERTIES aceita duas sintaxes:
GET FIELD PROPERTIES(tabelaNo;campoNo;Tipo;comprimento;indice)
GET FIELD PROPERTIES(campoPonteiro;Tipo;comprimento;indice)
Quando você um comando de multi-sintaxe - o compilador não pode adivinhar qual a sintaxe e os parâmetros que você selecionou. Você deve usar diretivas de compilador de variáveis de tipo passadas para o comando, se não forem digitadas de acordo com a sua utilização em outras partes do banco de dados.
- Comandos com parâmetros opcionais de diferentes tipos de dados
Quando você usa um comando que contém vários parâmetros opcionais de dados de diferentes tipos, o compilador não pode determinar quais os parâmetros opcionais foram utilizados. Aqui está um exemplo:
O comando GET LIST ITEM aceita dois parâmetros opcionais: o primeiro como um Longint e o outro como um booleano.
O comando pode então ser utilizada da seguinte forma:
GET LIST ITEM(lista;posicao;itemRef;texto;sub-lista;expandido)
ou como:
GET LIST ITEM(lista;posicao;itemRef;texto;expandido)
Você deve usar diretivas de compilador de variáveis tipo opcionais passados para o comando, se não forem tipadas de acordo com a sua utilização em outras partes do banco de dados.
- Métodos chamados via URLs
Se você escrever métodos 4D que precisam ser chamados através de uma URL, e se você não usar $1 no método, você deve declarar explicitamente a variável de texto $1 com a seguinte seqüência:
C_TEXT($1)
Na verdade, o compilador não pode determinar que o método 4D será chamado através de uma URL.
Se todas as variáveis usadas no banco de dados são explicitamente declaradas, não é necessário para o compilador verificar a tipagem. Neste caso, você pode definir as opções para que o compilador execute somente a fase de tradução do método. Isso economiza pelo menos 50% em tempo de compilação.
Você pode acelerar seus métodos usando diretivas de compilador. Para mais detalhes sobre este assunto, consulte a seção Dicas de otimização. Para dar um exemplo simples, suponha que você precisa incrementar um contador utilizando uma variável local. Se você não declarar a variável, o compilador assume que é um Real. Se você declará-la como um Longint, o banco de dados compilado irá executar com mais eficiência. Em um PC, por exemplo, um Real tem 8 bytes, mas se você digitar o contador como um Longint, utilizará apenas 4 bytes. Incrementar um contador de 8 bytes, obviamente, demora mais do que um incremento de 4 bytes.
Directivas do compilador podem ser tratadas de duas maneiras diferentes, dependendo se você deseja ou não que o compilador atribua um tipo as suas variáveis.
O compilador deve respeitar os critérios de identificação das variáveis.
Há duas possibilidades:
V1:=True
o compilador determina que a variável V1 é de tipo de dados Boolean.
Da mesma forma, se você escrever:
V2:="Esta é uma frase de exemplo"
o compilador determina que V2 é uma variável do tipo texto.
O compilador também é capaz de estabelecer o tipo de dados de uma variável em situações menos simples:
V3:=V1 `V3 é do mesmo tipo que que V1
V4:=2*V2 `V4 é do mesmo tipo que V2
O compilador também determina o tipo de dados das variáveis de acordo com as chamadas para os comandos 4D e de acordo com seus métodos. Por exemplo, se você passar um parâmetro do tipo Booleano e um parâmetro do tipo Data para um método, o compilador atribui o tipo booleano e o tipo data para as variáveis locais $1 e $2 no método chamado.
Quando o compilador determina o tipo de dados por inferência, salvo indicado o contrário nas preferências, nunca atribui os tipos de dados de limitação: Integer, Longint ou String. O tipo padrão atribuído pelo compilador é sempre o mais amplo possível. Por exemplo, se você escrever:
Número:=4
compilador designa o tipo de dados Número Real, apesar de 4 ser apenas um número inteiro. Em outras palavras, o compilador não descarta a possibilidade de que, noutras circunstâncias, o valor da variável poderia ser 4,5.
Se for apropriado para um tipo de variável como Integer, Longint ou String, você pode fazer isso usando uma diretiva de compilador. É a sua vantagem para fazer isso, porque estes tipos de dados ocupam menos memória e executar operações sobre elas é mais rápido.
Se você já digitou suas variáveis e está certo que a sua foi coerente e completo, você pode explicitamente pedir ao compilador para não refazer este trabalho, utilizando as preferências de compilação. No caso de a sua escrita não ter sido completa e exaustiva, no momento da compilação, o compilador retornará um erro solicitando que você faça as modificações necessárias.
Eles são utilizados da seguinte forma:
C_BOOLEAN(Var)
Através de tais diretivas, você informa o compilador para criar uma variável Var que vai ser um booleano.
Sempre que um aplicativo inclui diretivas de compilador, o compilador detecta-los e, assim, evita suposições.
Uma diretiva de compilador tem prioridade sobre as deduções feitas a partir de atribuições ou utilização.
Variáveis declaradas com a diretiva de compilador C_INTEGER são realmente as mesmas que as declaradas pela diretiva C_LONGINT. Eles são, na verdade, inteiros longos entre -2147483648 e 2147483647.
Se você não quiser que o compilador verifique a sua tipagem, você deve dar um código para identificar as directivas do compilador.
A convenção a seguir é:
Diretivas para o compilador e variáveis de processo e interprocesso e os parâmetros devem ser colocados em um ou mais métodos, cujos nomes começam com a palavra chave Compilador.
Por padrão, o compilador permite gerar automaticamente cinco tipos de métodos Compilador, que agrupam as diretrizes para as variáveis, matrizes e parâmetros do método (para mais informações sobre este ponto, consulte o manual de Projeto de Referência).
Nota: A sintaxe para declarar esses parâmetros é a seguinte:
Diretiva (nomeMétodo;Parametro). Esta sintaxe não é executável em modo interpretado.
Parâmetros particulares
• Parâmetros recebidos por métodos de banco de dados
• Triggers
O parâmetro $0 (Longint), que é o resultado de um trigger, é declarado pelo compilador se o parâmetro não foi explicitamente declarado antes. No entanto, se você quiser declará-lo, você deve fazê-lo no próprio trigger.• Objetos que aceitam o evento de formulário "On Drag Over"
O parâmetro $0 (Longint), que é o resultado do evento de formulário "On Drag Over", é digitado pelo compilador se o parâmetro não foi explicitamente declarado. No entanto, se você quiser declará-lo, você deve fazê-lo no próprio método de objeto.Nota: O compilador não inicializar o parâmetro $0. Assim, logo que você usar o evento de formulário On Drag Over, você deve inicializar $0. Por exemplo:
C_LONGINT($0)
If(FORM Event=On Drag Over)
$0:=0
...
If($DataType=Is picture)
$0:=-1
End if
...
End if
Diretivas do compilador eliminam qualquer ambiguidade sobre os tipos de dados. Apesar de que um certo rigor é necessário, isso não significa necessariamente que o compilador é intolerante de toda e qualquer inconsistência.
Por exemplo, se você atribuir um valor real a uma variável declarada como um inteiro, o compilador não considera tanto a atribuição como um tipo de conflito e atribui os valores correspondentes de acordo com suas diretrizes. Então, se você escrever:
C_INTEGER(vInteiro)
vInteiro:=2.6
O compilador não considera isso como um conflito do tipo de dados que impedem a compilação, ao contrário, o compilador simplesmente arredonda para o valor inteiro mais próximo (3 em vez de 2,6).
Detalhes de sintaxe
Dicas de otimização
Guia Digitação
Mensagens de Erro
Produto: 4D
Tema: Compilador
Manual de linguagem 4D ( 4D v20)
Manual de linguagem 4D ( 4D v20.1)
Manual de linguagem 4D ( 4D v20.2)
Manual de linguagem 4D ( 4D v20.3)
Manual de linguagem 4D ( 4D v20.4)
Manual de linguagem 4D ( 4D v20.5)
Manual de linguagem 4D ( 4D v20.6)