Projeto

Geral

Perfil

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
![](ExRef.png)
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
![](ResExRef.png)
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
![](projeto.png)
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
![](MakeRef.png)
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
![](ref_problem.png)
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
![](SetByRef.png)
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
![](GetByRef.png)
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
![](OnlyRead.png)
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
![](GetByRefWIthFeedback.png)
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
![](main.png)
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
![](main0.png)
63
64
Alteramos para 1 o valor de x in e temos:
65
![](main100.png)
66
67
Passado 1 segundo, temos:
68
![](main110.png)
69
70
Passado mais 1 segundo (2 segundos ao total), temos:
71
![](main111.png)