Clique em um dos botões para acessar as informações
correspondentes, conforme a documentação original fornecida por William Yu traduzida para o português.
|
Os operadores executarm operações matemáticas ou lógicas com os valores. Eles normalmente são abrangidos por uma expressão. Por
exemplo, 2 * 8 é uma expressão válida, e * é um operador agindo com os valores 2 e 8. O Rapid-Q pode avaliar tanto expressões
INFIX como POSTFIX (RPN), mas se você quiser avaliar expressões POSTFIX, você precisará observar os casos especiais. Operadores aritméticos: O Rapid-Q mantém uma tabela de precedência para cada operador. O operador d emaior precedência será sempre executado antes de qualquer operador de menor precedência. Para os operadores que compartilham a mesma precedência, prevalece a lei da associatividade da esquerda para a direita. Expressões entre perêntesis (...) automaticamente têm maior precedência do que expressões fora das chaves. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operadores Relacionais:
Os operadores relacionais são usados para comparar 2 valores. O resultado dessa comparação será sempre "true" (não zero ou verdadeiro) ou "false" (falso ou zero). Pode-se assumir que "true" seja igual a -1. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operadores Lógicos:
Os operadores lógicos realizam testes sobre múltiplas relações, manipulação de bits, ou operações booleanas e retornam um "true" (verdadeiro ou diferente de zero) ou "false" (falso ou zero) para ser usado na tomada de decisão. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INFIX/POSTFIX - Notação infixa/pósfixa: As expressões, na maioria das linguagens, são expressas em notação infixa [INFIX]. O Rapid-Q preferiu a notação infixa, mas pode também trabalhar com a notação posfixa [POSTFIX] em alguns casos especiais. Exemplo de expressão infixa [INFIX]: A = 4 * 7 + (4 - 1)^6 A notação infixa é mais fácil de usar e entender que a posfixa. De fato, a notação posfixa no Rapid-Q é simplesmente pró forma. É preferivel não usar a notação posfixa sempre que possivel. Exemplo de expressão posfixa [POSTFIX]: A = (4) (7) (*) (4) (1) (-) (6) (^) (+) As duas expressões devem resultar em 757. Como você vai notar, quando se tratar de notação posfixa, certifique-se de que todos os operandos e operadores estão entre chaves. Ao lidar com negação, você vai ter que fazer o seguinte: Exemplo de expressão posfixa com negação: A = (5) (0-5) (-) Observe que (0-5) e (-5) retornam diferente resultados. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
O Rapid-Q tem estas variáveis já definidas: $DEFINE WIN32 WIN32 $DEFINE UNIX UNIX $DEFINE TYPE STRUCT WIN32 deve ser definida se estiver usando a versão do Rapid-Q para o Windows. UNIX deve ser definida se estiver usando a versão do Rapid-Q para Linux/Unix. TYPE deve ser definido para substituir o estilo antigo de TYPE
Desfazendo definições: O termo "desfazendo" significa revertendo uma definição. Exemplo: $UNDEF TYPE Exemplo: $UNDEF TYPE Esta é a única definição (até agora) que pode afetar seu programa quando revertida. Veja a sessão UDF "Tipos Definidos pelo Usuário" para obter mais informações.
Usando definições: O capitulo 3 da Documentação lista vários exemplos de uso de $IFDEF e $IFNDEF: $IFDEF WIN32 PRINT "Estou usando a versão Windows!" $ELSE PRINT "Estou usando a versão Linux/Unixn!" $ENDIF | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Um tipo de dados é apenas uma definição. É usada para vincular uma variável à sua definição e não pode ser alterada uma vez vinculada (exceto para variáveis do tipo VARIANT). Por exemplo, se uma variável é vinculada a um tipo de dados STRING,não pode mudar para uma definição de inteiro [INTEGER]. A uma variável pode ser atribuída qualquer um desses tipos de dados suportados, BYTE, WORD, DWORD, SHORT, LONG / INTEGER, SINGLE, DOUBLE, STRING VARIANT, e strings de comprimento fixo. Há também coisas como tipos de dados definidos pelo usuário, que serão discutidas em outra seção. Algumas implementações BASIC incluem INTEGER como um valor de 16 bits, enquanto o Rapid-Q escolheu um valor de 32 bits. Então, se você está preocupado com a conversão do código antigo, certifique-se de substituir todas as ocorrências com SHORT por INTEGER. Como usar os tipos de dados: Pelo Rapid-Q ser uma linguagem BASIC, há 2 maneiras de definir suas variáveis. Pode-se escolher fazer isso explicitamente usando DIM. DIM meuNumero AS LONG DIM minhaString AS STRING Similarmente, pode-se juntar um sufixo que define o tipo de variável: meuNumero& = 234 minhaString$ = "abc" O capitulo 3 da Documentação tem uma lista com esses sufixos, mas que são listados aqui também para sua conveniência: Tipe ID Tamanho Alcance --------- ----- ------------- ------------- Byte ? 1 0..255 Word ?? 2 0..65535 Dword ??? 4 Só na versão Linux por enquanto... Short % 2 -32768..32767 Integer & 4 -2147483648..2147483647 Long & 4 -2147483648..2147483647 Single ! 4 1.5 x 1045..3.4 x 1038 Double # 8 5.0 x 10324..1.7 x 10308 String $ Um tipo de variável variant não tem sufixo, deve-se sempre usar DIM, ou mudar a operação DIM previamente definida [default]. $OPTION DIM VARIANT minhaVariavel = "hello!" A 'minhaVariavel' poderá ser definida como uma VARIANT desde que se tenha mudado o tipo de dado predefinido com DIM. Sempre que uma variável Rapid-Q vem sem um sufixo, ele irá escolher o tipo de dados de acordo com o BASIC tradicional. O tipo de dado VARIANT: A Variant é um gênero especial de tipo de dado, visto que ele pode sofrer mutação. Não tenha medo, ela não irá sofrer mutações para um vírus ou algo parecido. Ela simplesmente muda de tipo em tempo real, conforme necessário. Mesmo numa operação simples, como uma adição, quando você adiciona duas variant. Veja este exemplo: DIM V1 AS VARIANT, V2 AS VARIANT V1 = 101 V2 = "99.5" PRINT V1+V2 '-- A saída será 200.5 (numero) Como pode notar, V2 é originalmente definida como string, mas V2 mudou seu tipo para um número de ponto flutuante quando a adição ocorreu. Note que V2 é ainda uma string, ela apenas se alterou para possibilitar a operação. Da mesma forma: DIM V1 AS VARIANT, V2 AS VARIANT V1 = "101" V2 = 99.5 PRINT V1+V2 '-- A saida é 10199.5 (string) Neste caso, V2 era originalmente um número de ponto flutuante, mas mudou seu tipo durante a operação para uma string. Observe como a ordem de operação define a mutação. No exemplo anterior, V1 era um número, então V1 + V2 resulta em uma expressão numérica, enquanto o exemplo acima produz uma string. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A ramificação [Branching] parece ser muito popular em BASIC, principalmente porque nos velhos tempos, o BASIC era muito desestruturado e não levava com ele os conceitos que vemos hoje. Claro, alguns dizem que ainda não é estruturado, mas assim são um monte de outras linguagens, dependendo do seu estilo de programação. A ramificação é apenas o mecanismo que possibilita pular (jump) instruções, para a frente ou para trás. Isso é muito parecido a escrever SUBS e FUNCTIONS, apenas um pouco mais estruturado, como você verá. O que são labels? [Rótulos] Antes de falar sobre GOTOs e GOSUBs, precisamos entender o que os labels são. Você pode pensar neles como etiquêtas, eles não fazem nada, mas você pode usá-los como marcadores ou guias. A seguir, exemplos de labels válidos: Label1: 100 10.5 Um label aparece sempre como a primeira declaração e pode ser qualquer número ou um nome. O label formado por um nome tem de terminar com dois pontos [:]. Depois de qualquer label, você pode escrever seu código normalmente. Label1: PRINT "escreva qualquer código..." 100 PRINT "mais código" 10.5 PRINT "e ainda mais código" A formatação acima é apenas um exemplo, isso não significa que um label com o nome não possa ter o código na mesma linha. Ramificação com GOTO: Talvez o mais temível sobre palavras chaves em BASIC é a declaração GOTO. Óbviamente, se você já programou em BASIC antes, GOTO foi usado em quase toda parte. Isto é porque GOTO era muito fácil de entender, e nós demos assim o primeiro salto em programação, visto que não costumávamos usar subrotinas e funções. O Rapid-Q ainda suporta GOTO, mas nós definitivamente não incentivamos o seu uso. Na verdade, se você se pegar usando-o agora não se espante, mas em alguns anos/meses você se tornará mais experiente. Aqui está um exemplo de como usar GOTO: IF I = 100 THEN GOTO 10 ELSE GOTO 20 10 PRINT "I = 100" END 20 PRINT "I não é 100" END Se é tão terrível, há perigo no seu uso? Não. Na verdade, provavelmente é o mais puro comando que você vai encontrar. Tudo que faz é ignorar certas instruções, assim, no exemplo acima, se I = 200, então pula as linhas com o label 10: 10 PRINT "I = 100" END GOTO não requer pilha ou consumo de memória, diferente de GOSUB e SUBS ou FUNCTIONS. Se você quer pensar sobre a arrumação do programa que é basicamente tudo que você faz; um ramo aqui outro ali não faz mal, mas desde quando consideramos o BASIC uma linguagem de alto nível, nós geralmente não gostamos de pensar desse jeito, por isso, evitamos o uso de GOTO, se possível. Ramificação com GOSUB .. RETURN: Usar GOSUB é realmente mais útil do que usar GOTO, mas não é recomendado. É em essência, como chamar uma SUB sem parâmetros. O que ele oferece é um "hack" rápido sem a criação de SUBs. Ele é às vezes usado em loops, como você pode ver aqui: DO DO A$ = INKEY$ LOOP UNTIL LEN(A$) IF A$ = "A" THEN GOSUB 100 ELSEIF A$ = "B" THEN GOSUB 110 ELSEIF A$ = "C" THEN GOSUB 110 END IF LOOP END 100 PRINT "A pressionado" RETURN 110 PRINT "B pressionado" RETURN 120 PRINT "C pressionado " RETURN A instrução de retorno RETURN é usado para retornar para o ponto da chamada anterior de GOSUB. Você pode pensar em GOSUB como uma instrução GOTO com um marcador, e a declaração RETURN como outra declaração GOTO que retorna ao marcador. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tipos definidos pelo usuário (ou UDTs) são estruturas que você pode usar na maioria das linguagens BASIC, Rapid-Q não é exceção. Usando TYPE: Aqui está um exemplo de tipo definido pelo usuário: TYPE TPalavra nomeCidade(100) AS STRING População(100) AS LONG END TYPE DIM World AS TPalavra Como pode ver, você pode ter arrays [matrizes de dados] dentro de UDTs. Pode também criar arrays de UDTs: TYPE TPalavra nomeCidade(100) AS STRING População(100) AS LONG END TYPE DIM Campo(100) AS TPalavra Existe atualmente um problema com o endereço de memória de seu array (dentro da UDT). Note porém que este é dificilmente notado, a menos que você vá passar uma dessas estruturas para uma DLL que exija arrays dentro de UDTs. Este problema de endereço não irá afetar o seu programa, mas é difícil de explicar (sem ficar demasiado profundo). NOTA: só ocorre quando você cria arrays de UDTs que têm arrays dentro de UDTs. No exemplo acima não há nenhum problema de endereço desde que você não esteja criando um array de UDTs. Você poderia passá-lo com segurança para uma DLL. Copiando UDTs: Para copiar UDTs, apenas defina as duas: TYPE TConteudo A AS LONG B AS INTEGER END TYPE DIM S1 AS TConteudo DIM S2 AS TConteudo S1 = S2 O conteúdo em S2 é copiado para S1. Já ao lidar com arrays dentro de UDTs, os arrays não são copiados, apenas referenciados. Para copiar arrays de UDTs, você vai ter que copiar manualmente cada um: DIM S1(100) AS TConteudo DIM S2(100) AS TConteudo FOR I = 1 TO 100 S1(I) = S2(I) NEXT Desfazendo TYPE: Na verdade, existem duas maneiras de criar seus tipos, com TYPE e STRUCT. STRUCT é, na verdade espelhado em TYPE, para desenganchar os dois você tem que usar $UNDEF TYPE. $UNDEF TYPE TYPE TWorld nomeCidade(100) AS STRING População(100) AS LONG END TYPE DIM World AS TWorld Usando TYPE e STRUCT não é a mesma coisa. Se você desenganchar os dois, TYPE agora volta a ter o estilo antigo (versão pré-maio 17), onde arrays de UDTs não eram permitidas. Por que iriamos querer uma versão simplificada? Bem, talvez o desempenho. O TYPE de estilo antigo carece de muitas coisas, mas compensa no desempenho, se isso for realmente necessário. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
As instruções condicionais oferecem a capacidade de executar código para o qual as condições são satisfeitas. Esta é provavelmente uma das primeiras coisas que você aprende na programação, além do usual. IF .. THEN .. ELSE Há dois modos de usar IF .. THEN .. ELSE. : Você pode colocar a sua declaração em uma única linha assim: IF X > 100 THEN PRINT "X é maior do que 100" Ou dividi-la assim: : IF X > 100 THEN PRINT "X é maior que 100" END IF Como você pode ver, X > 100 é uma condição, e quando esta é satisfeita o código é executado, se não, então parte do código é ignorado. A condição é satisfeita quando a expressão é avaliada como qualquer número, como diferente de zero. O que significa também que ela é válida: X = 100 IF X THEN PRINT "Condição satisfeita" ELSE PRINT "Condição não satisfeita" END IF Use ELSEIF sempre que você tem várias condições para serem satisfeitas: IF X > 10 AND X < 20 THEN ''coloque conteúdo ELSEIF I > 55 THEN ''coloque conteúdo ELSE ''coloque conteúdo END IF Às vezes ajuda usar Select Case ao invés de todas estas ELSEIFs, o que abordaremos em seguida. SELECT CASE .. END SELECT: As Select Cases são geralmente aplicadas quando você tem um monte de condições que você deseja testar. Não são realmente úteis se você só tem 2 ou 3 condições, mas ninguém proibirá você de usá-las. Não há casos especiais na utilização de SELECT CASE no Rapid-Q, neste caso tudo que você aprendeu em QBasic pode ser implementado aqui também. SELECT CASE Expressão CASE 1 ''coloque conteúdo CASE 5 ''coloque conteúdo CASE ELSE ''Condição não satisfeita, coloque conteúdo END SELECT Provavelmente envolve menos digitação, mas há muitas outras finalidades úteis, por exemplo, testes de faixa se tornam muito mais fáceis: SELECT CASE Expressão CASE 1 TO 4, 10 TO 20 ''coloque conteúdo CASE 100 TO 150 ''coloque conteúdo CASE IS > 200 ''coloque conteúdo END SELECT Como pode ver, você pode ter condições de testes múltiplos, separando cada um com uma vírgula.Você pode descobrir como a palavra chave IS é usada. (Caso Expressão > 200) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Os Loops fornecem um mecanismo para executar uma série de instruções um determinado número de vezes. Muitos programas envolverão loops. Os compiladores convertem loops de instruções GOTO, para que você possa implementar seus próprios loops usando os GOTOs sem quaisquer problemas. No entanto, para fins de otimização, o loop FOR... NEXT em Rapid-Q não usa esse mecanismo para economizar instruções desnecessárias. Você poderá notar que o seu loop FOR é ligeiramente mais rápido do que o seu WHILE ou DO Loop no Rapid-Q. O loop FOR .. NEXT Como foi mencionado anteriormente, em Rapid-Q esta estrutura de loop é otimizada, e você poderá notar uma ligeira diferença de velocidade. Existem alguns casos especiais, quando se utiliza um loop FOR em Rapid-Q, observe: FOR I (1) = 1 to 100 NEXT Este loop não é válido em Rapid-Q. Por que não? Porque I (1) é um array, você terá um erro de compilador. Apenas tipos simples são suportados, o que significa qualquer coisa menos matrizes. O valor de incremento padrão é 1, se você quiser um valor de incremento diferente, por favor use STEP: FOR I = 1 TO 100 STEP 2 PRINT I NEXT Este loop irá pular por todos os números pares, então a saída será: 1 3 5 7 9 etc ... Se por qualquer motivo você queira sair do loop, você pode usar EXIT FOR. WHILE .. WEND Se você quiser testar uma condição antes de entrar no loop, você poderia usar um loop WHILE .. WEND. Não há casos especiais, quando utilizar este ciclo, é exatamente como no QBasic: WHILE I < 100 I ++ '-- Incrementa I WEND É muito semelhante ao DO .. LOOP , exceto que a expressão é testada antes de entrar no loop. Para sair do loop WHILE .. WEND por qualquer motivo, você pode usar Exit While. DO .. LOOP Um simples DO .. LOOP sem qualquer expressão de teste se repetirá indefinidamente: DO PRINT "Alô mundo ! " LOOP Para sair do DO .. LOOP , você usa EXIT DO . Loops infinitos não são muito utilizados na programação Windows. Você geralmente quer uma expressão de teste como no nosso loop .. WEND , a não ser que o coloquemos de forma diferente: DO I ++ LOOP UNTIL I >;= 100 Ao contrário do QBasic ou de outras linguagens BASIC, o Rapid-Q não oferece DO WHILE ou WHILE LOOP . Eles são basicamente inúteis (ou seja, eles podem ser implementados de outra maneira), exceto para fornecer aos usuários mais opções. Por exemplo, esta opção é válida em QBasic e não em Rapid-Q: DO LOOP WHILE I < 100 O qual é equivalente a: DO LOOP UNTIL I >= 100 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Há muitas definições de um "método", mas por falta de uma palavra melhor, é essa que estou usando para descrever o método CONSTRUCTOR, CREATE e WITH . Sozinhos, eles não servem de nada, mas você vai aprender o que cada um faz, e como usá-los. CREATE .. END CREATE Usar CREATE é o mesmo que usar DIM. CREATE Form AS QForm END CREATE ''é o mesmo que... DIM Form AS QForm No entanto, o método CREATE oferece mais. Ele pode lhe salvar de uma longa digitação, e também fazer o visual do seu código ficar mais limpo por incorporar CREATEs (consulte o Capítulo 5). Qualquer código que você digitar entre CREATE .. END CREATE é automaticamente vinculado ao objeto. Uma vez que não há nenhum ponto a acrescentar ao que já foi mencionado, consulte o Capítulo 5 para obter alguns exemplos. WITH .. END WITH O construtor WITH fornece ao desenvolvedor uma maneira mais fácil de referenciar propriedades, métodos e eventos de certos objetos. Basicamente o que ele faz é evitar um monte de digitação: Form.Caption = "Alô" Form.height = 50 Form.left = 10 Form.ShowModal '' Usando WITH... WITH Form .Caption = "Alô" .height = 50 .left = 10 .ShowModal END WITH Você também pode incorporar declarações WITH .. END WITH dentro de outras: WITH AlgumaCoisa WITH OutraCoisa . Caption = "Alô" END WITH END WITH Como você pode ver, a declaração WITH herda a declaração anterior. O ponto à esquera diz ao compilador para vincular essa variável à declaração WITH. Qualquer coisa que não começa com um ponto não será vinculado, não se preocupe números decimais não serão vinculados. CONSTRUCTOR .. END CONSTRUCTOR Este método é usado somente dentro de uma declaração TYPE quando você está definindo seus próprios objetos. Ele vai dar valores padrão para as propriedades, sempre que o componente é criado. TYPE NovoObjeto EXTENDS QObject Left AS INTEGER CONSTRUCTOR Left = 50 END CONSTRUCTOR END TYPE Não há nada mais a dizer sobre ele, é muito parecido com o método CREATE, exceto que o nosso objeto neste caso é NovoObjeto. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Uma procedure em BASIC é uma SUB ou uma FUNCTION (ou, SUBI e FUNCTIONI.) É funcionalmente o mesmo que GOSUB e RETURN , mas introduz o conceito de parâmetros e valores de retorno. Diferente do QBasic, uma função também pode ser chamada como uma SUB. Você pode ignorar o seu valor de retorno. DECLARE SUB Use DECLARE SUB sempre que precisar fornecer uma declaração antecipada antes de realmente escrever o SUB. DECLARE SUB Test CALL Test SUB Test '' Preencha... END SUB Usar CALL para chamar a sub-rotina é estritamente opcional. (Veja abaixo) No exemplo acima, estamos fornecendo uma declaração antecipada da SUB Test. Para evitar o uso de DECLARE SUB, poderiamos ter escrito a SUB Teste antes de chamá-la. Veja: SUB Test '' Preencha... END SUB Test "Sem o CALL. Desta forma, você não precisa usar DECLARE SUB , embora usá-la seja mais elegante e ordeiro. Usando-a os nomes dos parâmetros na DECLARE SUB e na declaração no início da SUB devem ser exatamente iguais! Observe este exemplo errado: DECLARE SUB Test ( A AS INTEGER, B AS INTEGER) SUB Test ( X AS INTEGER, Y AS INTEGER) PRINT X ;" "; Y END SUB Os nomes das variáveis foram alterados! Isto porque, quando você definiu a DECLARE SUB , os nomes dos parâmetros foram fixados como A e B. O melhor para evitar esse problema é que você pode confortavelmente fazer o seguinte: DECLARE SUB Test (A AS INTEGER, B AS INTEGER) SUB Test PRINT A;" ";B END SUB Isto é perfeitamente válido, pois você já declarou a sua rotina com os parâmetros A e B. Você realmente não precisa definir os parâmetros novamente se você já tem uma declaração antecipada. Mas como isso pode gerar alguma confusão, não é recomendado. Passando variáveis por referência Há duas maneiras de passar variáveis por referência. Ao contrário de outras linguagens BASIC, Rapid-Q assume que todos os parâmetros são passados por valor, a menos que explicitamente especificado. Para fazer isso, você pode anexar a palavra-chave ByRef na frente de sua lista de parâmetros. Aqui está um exemplo: SUB StrCat (BYREF Fonte AS STRING, Texto AS STRING) Fonte = Fonte + Texto END SUB A$ = "Alô" StrCat A$, "mundo!" PRINT A$ '-- retorna "Alô mundo!" Outra maneira é colocar o símbolo '@' na frente da variável: SUB StrCat (Fonte AS STRING, Texto AS STRING) Fonte = Fonte + Texto END SUB A$ = "Alô" StrCat @A$, "mundo!" PRINT A$ '-- retorna "Alô mundo!" FUNCTIONs versus SUBs A única diferença entre uma FUNCTION e uma SUB é que uma FUNCTION retorna um valor e a SUB não. FUNCTION Test AS INTEGER Test = 123 Result = 123 END FUNCTION Rval% = Test "Chama e pega o valor retornado. Nossa função "Test" retorna um inteiro, como podemos ver claramente retorna 123. Para retornar um valor, você pode usar o nome da função ou usar a palavra chave Result . Só porque você anexa um valor de retorno para a função, ela não termina automaticamente, até que chegue a; FUNCTION END. Então você pode realmente atribuir vários valores de retorno como desejar, sem conseqüências. O último valor de retorno atribuído acabará por ser o único resultado da FUNCTION . Para sair de uma FUNCTION ou SUB , é só usar Exit Function ou Exit Sub respectivamente. Um caso especial em usar SUBs ou FUNCTIONs em Rapid-Q é que você só pode passar no máximo 10 parâmetros. QObjects, Arrays, UDTs e variantes são passados por referência, todo o resto é passado por valor. Para que o Rapid-Q reconheça que você quer passar uma variável por referência, você deve anexar um símbolo @ na frente da variável, ou usar ByRef na sua lista de parâmetros. Consulte o Capítulo 3 seção 5 para mais informações. SUBI e FUNCTIONI Há um capítulo inteiro reservado para estes dois métodos de procedures. Não são realmente tão complicados, mas são muito úteis para uso. Eles fornecem ao programador parâmetros infinitos sem verificação de tipo. Apenas tipos simples, como números e strings podem ser passados, não Arrays, UDTs ou QObjects. Consulte o Capítulo 9 para todos os detalhes. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Como depurar seus programas Na maioria dos casos, o que ocorre é um erro de digitação, ou você está tentando usar uma função que não é suportada no Rapid-Q. Isso é o que ocorre na maioria das vezes quando você não está usando $TypeCheck ON. A menos que você já tenha usado o Rapid-Q por algum tempo, eu o encorajo a sempre ativar essa directiva. O Rapid-Q tem um mecanismo de verificação muito pobre o que exige do programador escrever um código correto. Por exemplo: PRINT SPC (10) SPC não é suportado no Rapid-Q (em QBasic, SPC apenas ignora espaços). Se $TypeCheck não estiver ativado, a linha do exemplo é perfeitamente válida. SPC será considerado uma variável, inicializado a 0, e (10) não terá nenhum efeito (ou seja, o número 10 é empurrado na pilha, mas nenhuma operação será feita), então a saída acima será 0. Passando variáveis por referência Apenas QObjects, matrizes e variantes são passados por referência, todas as outras variáveis são passadas por valor. Para passar uma variável por referência você pode especificar explicitamente isso adicionando ByRef à sua lista de parâmetro, ou preceder com o símbolo @ para todas as variáveis que você deseja passado por referência ao chamar a função. Não use o símbolo @ para Arrays, variantes, ou& QObjects uma vez que já são passados por referência por padrão. Leia mais sobre isso no Capítulo 3 ou Apêndice C. Procedures (procedimentos). Typechecking (verificação de tipo) é feito apenas para Arrays, variantes, e QObjects, visto que você não pode passar um array de integers (inteiros) para uma SUB que espera uma matriz de doubles (duplos). Você deverá receber uma mensagem de erro se você tentar isso, no entanto, para todas as outras variáveis que são passadas por valor, nenhuma verificação é feita. O que significa que você pode facilmente passar um inteiro para uma SUB esperando uma string. Então, tome cuidado você deve saber o tipo de parâmetros para a sua SUB / FUNCTION, uma vez que Rapid-Q não vai indicar esse erro. Também, se você tem DECLARE SUBS, certifique-se de que a sua SUB tenha correspondência de parâmetros, incluindo correspondencia do parâmetro nome. Usando recursos não documentados O Rapid-Q tem algumas características não documentadas, a maioria das quais estão em fase beta. Você pode imbutir SUBS ou FUNCTIONS, mas só pode haver um nível de profundidade, e há algumas conseqüências com esse uso. Se você não sabe o que é uma SUB embutida observe este exemplo: SUB MinhaSub DIM I AS INTEGER SUB MinhaSubImbutida (X AS INTEGER) DIM N AS DOUBLE PRINT "Na Sub Imbutida" END SUB CALL MinhaSubImbutida(100) END SUB Há alguns problemas especiais envolvidos, porque todas as variáveis são locais para as SUBs que seguem. Significando que a variável I é local para a SUB MinhaSubImbutida. Além disso, como o Rapid-Q na verdade não limpa as coisas, você pode chamar MyChildSub em seu programa principal também. Este é um problema em que estou trabalhando para corrigir quando eu encontrar; tempo. Uma outra característica que pode interessar as pessoas é postfix + + e -- DIM I AS INTEGER I++ '-- o mesmo que I = I + 1 I-- '-- o mesmo que I = I - 1 I -= 10 '-- o mesmo que DEC(I, 10) I += 15 '-- o mesmo que INC(I, 15) Matrizes são um caso especial, alguma coisa como, Arrays podem ser incrementadas / decrementadas. O Rapid-Q não faz nenhuma otimização, de modo que o código dado acima e a equivalência executam exatamente igual. Outros erros Se você não tem uma pista sobre o que está causando falhas em seus programas, sua única esperança é colocar várias instruções PRINT em seu programa e de forma incremental ir verificando cada bloco de código para ver se ele funciona corretamente. Se você estiver usando Unix ou Linux, tente usar gdb, às vezes ele vai dar algumas informações úteis, mas na maioria das vezes não é realmente útil neste tipo de configuração. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
As variáveis internas são apenas de leitura (exceto SCREEN.CURSOR e SCREEN.CURSORS). Unix, quer dizer Linux e Unix.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A maioria destas tem a mesma funcionalidade que em QBasic, assim, você poderia facilmente encontrá-las lá. Mais uma vez, Unix, quer dizer Linux e Unix. As seguintes palavras chave são todas englobadas no objeto CONSOLE, assim Console.PRINT é o mesmo que PRINT.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A maioria destas palavras tem a mesma funcionalidade que no QBasic, assim você poderia facilmente encontrá-las lá. Mais uma vez, quando me refiro ao Unix, quero dizer Linux e Unix.
|
|
|