Utilizando passagem de parâmetros por referência em classes » Histórico » Versão 13
Antonio de Souza Gomes Pereira, 13/02/2020 12:15 h
| 1 | 1 | Gabriel Borges da Conceição | # Utilizando passagem de parâmetros por referência em classes |
|---|---|---|---|
| 2 | |||
| 3 | 8 | Gabriel Borges da Conceição | Todos os arquivos do projeto que será utilizado de exemplo neste tutorial de passagem de parâmetros por referência estão disponíveis para serem baixados em ReferenceWiki.rar, adicionado à wiki ao final desta página. |
| 4 | 1 | Gabriel Borges da Conceição | |
| 5 | 2 | Gabriel Borges da Conceição | |
| 6 | |||
| 7 | Primeiramente, vamos mostrar como utilizar as ferramentas necessárias à passagem de parâmetros por referência em LabVIEW de forma mais geral, com um Numeric. E depois partiremos para a utilização em classes e com o objetivo de compartilhar informação entre whiles independentes, o qual é o objetivo de usarmos essa ferramenta na reformulação da arquitetura de software pela qual estamos passando. |
||
| 8 | |||
| 9 | |||
| 10 | 9 | Gabriel Borges da Conceição | Criamos uma VI chamada DataReferenceWithNumeric e fizemos duas situações parecidas, porém uma utilizando referência e a outra não: |
| 11 | 2 | Gabriel Borges da Conceição | |
| 12 |  |
||
| 13 | |||
| 14 | O que está acontecendo é: |
||
| 15 | 3 | Gabriel Borges da Conceição | No for loop de baixo, a cada iteração um valor entra e ele é incrementado de 1. Isso é feito 100 vezes. Porém, nada está alterando o valor de entrada, já que é uma constante. Então, em todas 100 iterações, entra o valor 0. |
| 16 | 2 | Gabriel Borges da Conceição | |
| 17 | 10 | Gabriel Borges da Conceição | O for loop de cima faz a mesma coisa. A diferença é que ao entrar um valor e ser incrementado de 1, isso é escrito na referência criada para o nuemric double constant 0. Na iteração seguinte, como estamos lendo o valor a partir da referência na memória, recebemos o valor que foi incrementado e escrito na iteração anterior. Ou seja, a entrada do for muda a cada iteração. |
| 18 | 2 | Gabriel Borges da Conceição | |
| 19 | Temos então o seguinte resultado: |
||
| 20 | 1 | Gabriel Borges da Conceição |  |
| 21 | 3 | Gabriel Borges da Conceição | |
| 22 | |||
| 23 | |||
| 24 | |||
| 25 | Agora partiremos para a utilização em classes. |
||
| 26 | |||
| 27 | Criamos o seguinte projeto: |
||
| 28 |  |
||
| 29 | |||
| 30 | Criamos a classe Class 1 que tem apenas os atributos x e y. A ideia é criarmos uma referência para a classe, escrever na referência num while e conseguir ler esse valor alterado em outro while, sem ter fios interligando-os. |
||
| 31 | |||
| 32 | Por algum motivo que ainda desconheço, não foi permitido criar a referência para a classe na função main (a qual não é um método). Então, por isso, criamos o método MakeRef que o faz: |
||
| 33 | OBS: Curiosamente, no nosso projeto Phoenix, foi permitido criar a referência para as classes na VI principal Phoenix.vi sem utilização de métodos. |
||
| 34 |  |
||
| 35 | |||
| 36 | |||
| 37 | 13 | Antonio de Souza Gomes Pereira | Atualização 13/02/2020: Outra solução, além de criar o método MakeRef, é fazer a mudança nas propriedades da classe. |
| 38 |  |
||
| 39 | Basta apertar na classe com o botão direito e ir em suas propriedades e depois em inheritance, a opção com a restrição de criação de referências vai estar marcada, basta então desmarcar. |
||
| 40 | |||
| 41 | |||
| 42 | 3 | Gabriel Borges da Conceição | Criamos depois o método SetByRef que recebe e lê a referencia, recebe também dois numeric double como entradas, seta nos atributos da classe e escreve isso na referência: |
| 43 |  |
||
| 44 | Perceba que o objeto de entrada do método não foi alteado. Foi alterado o objeto que está na referência recebida como entrada desse método. O fato de levar o objeto ao bloco de escrita Data Value Reference Read/Write Element é o que altera a referência em memória. |
||
| 45 | 4 | Gabriel Borges da Conceição | |
| 46 | |||
| 47 | Criamos depois o método GetByRef que recebe a referência, a lê, pega os atributos do objeto e os retorna em Indicators: |
||
| 48 |  |
||
| 49 | 5 | Gabriel Borges da Conceição | Perceba que o Data Value Reference Read/Write Element da direita não é o de escrita. Quando é o de escrita, o programador é obrigado a informar um valor. Mas como queremos apenas ler nesse caso, podemos trocar para permitir apenas leitura. Para isso, basta clicar com o botão direito do mouse no elemento de escrita e: |
| 50 |  |
||
| 51 | |||
| 52 | 6 | Gabriel Borges da Conceição | Criamos o último método GetByRefWithFeedback, o qual é semelhante ao GetByRef, porém retorna o valor da última iteração: |
| 53 | 5 | Gabriel Borges da Conceição |  |
| 54 | |||
| 55 | |||
| 56 | 11 | Gabriel Borges da Conceição | Por fim, juntamos tudo isso na VI main (essa VI não é um método da classe) da seguinte forma: |
| 57 | 5 | Gabriel Borges da Conceição |  |
| 58 | |||
| 59 | 12 | Gabriel Borges da Conceição | Apenas por uma escolha de melhor visualização, colocamos um wait de 1000ms no while de leitura para que demore 1 segundo para o valor de leitura ser alterado e, consequentemente 2 segundos para o valor de leitura com feeback node ser alterado, a partir do instante em que o while de cima muda o valor e o escreve na referência. |
| 60 | 5 | Gabriel Borges da Conceição | |
| 61 | Ao rodar o código, temos: |
||
| 62 |  |
||
| 63 | |||
| 64 | Alteramos para 1 o valor de x in e temos: |
||
| 65 |  |
||
| 66 | |||
| 67 | Passado 1 segundo, temos: |
||
| 68 |  |
||
| 69 | |||
| 70 | Passado mais 1 segundo (2 segundos ao total), temos: |
||
| 71 |  |