Passagem de parâmetros por referência

Mais um da série desafios...

Moderador: Moderadores

Responder
Avatar do usuário
cracksther
Diamante
Diamante
Mensagens: 1063
Registrado em: Seg 13 Dez 2004 11:00:00 pm

Passagem de parâmetros por referência

Mensagem por cracksther »

Um parâmetro (ou argumento) pode ser enviado á uma função em duas maneira:
Por cópia -> é enviado apenas um cópia do parâmetro, ou seja, apenas o valor:
[lsp]
(defun soma (x / )
(setq x (+ x 10))
(princ "\nA soma é: ")
x
)[/lsp]
[lsp](setq var 10)
(soma var)
(setq var2 20)
(soma var2)[/lsp]
Nos exemplos acima é enviado apenas o valor das variáveis para a função soma, no entando após a execução a variáveis var e var2 continuam com seus valores originais
...
Essa é a forma que sempre vejo sendo utilizada ao passar parâmetros á uma função, então á pergunta é:
Como passar um parâmetro por referência, ou seja após a execução do exemplos acima, os valores de var e var2 devem ser alterado conforme a soma...
...
Isso é muito comum em algumas liguagens de programação, porém não vejo acontecer em AutoLISP, embora este recurso seja suportado...
...
Se ninguém responder eu voltarei com dicas... insistindo a falta de resposta eu mesmo responderei.

Até mais!
Editado pela última vez por cracksther em Qua 18 Fev 2009 12:47:55 pm, em um total de 1 vez.
Marcelo Silva - Cascavel - PR
cracksther@gmail.com
Avatar do usuário
laudemir
Prata 2/3
Prata 2/3
Mensagens: 532
Registrado em: Qui 29 Mar 2007 12:00:00 am
Contato:

Mensagem por laudemir »

Quando eu preciso que retorne o valor atual uso um recusro bem simples

(setq var 10 var (soma var))

quando retorna o valor da função, ela ja soma o valor 10 para 20

se tiver de fazer o calculo novamente num programa

(bla bla bla .....
......
....
(setq var (soma var)) = 30
dai segue a rotina com valor atual.........

bom esta é uma das formas.... estarei esperando as outras formas conforme sua dicas...........

t+
"As respostas dos problemas, geralmente são mais simples que pensamos"
maketreis@itelefonica.com.br
Veja outros artigos http://lautolisp.blogspot.com/
Estou iniciando em blog, mas ja é um começo....
Avatar do usuário
cracksther
Diamante
Diamante
Mensagens: 1063
Registrado em: Seg 13 Dez 2004 11:00:00 pm

Mensagem por cracksther »

laudemir... Eu já esperava esta resposta, porém a mesma não responde a pergunta... Eu utilizo bastante o recurso citado por você, porém somente é útil para 01 parametro, ou seja, se for necessário atualizar 02 ou mais variáveis o esquema citado não funciona, visto que toda função em AutoLISP retorno somente 01 valor...
...
Persistindo a falta de resposta, no final do dia (ou amanhã) eu colocarei uma dica...

Até mais!
Marcelo Silva - Cascavel - PR
cracksther@gmail.com
Avatar do usuário
cracksther
Diamante
Diamante
Mensagens: 1063
Registrado em: Seg 13 Dez 2004 11:00:00 pm

Mensagem por cracksther »

Impressionante como um recurso tão útil nas poderosas C/C++ e Win32 API passa praticamente despercebido em AutoLISP.
Exemplo:
[lsp];;;Função que altera o conteúdo de variáveis globais passadas por parâmetro
(defun incrementa (v1 v2 / )
(set v1 (+ (eval v1) 10))
(set v2 (+ (eval v2) 20))
)
;;;Variáveis Globais
(setq
s1 10
s2 20
)
;;;Forma de chamada á função
(incrementa 's1 's2)
;;;Teste do resultado
(princ s1)
(terpri)
(princ s2)[/lsp]
...
Espero que seja útil para mais alguém além de mim.
...
Até mais!
Marcelo Silva - Cascavel - PR
cracksther@gmail.com
Avatar do usuário
cracksther
Diamante
Diamante
Mensagens: 1063
Registrado em: Seg 13 Dez 2004 11:00:00 pm

Mensagem por cracksther »

Um recurso semelhante eu utilizei no tópico filtrar pontos (criado pelo neyton) que possibilitou descobrir pontos próximos de uma lista grande sem a necessidade de ordenar a lista, desta forma ganhando bastante tempo na execução...

É possível também usar string representando o nome da variável, o que possibilita inclusive criar nomes de variáveis dinamicamente (veja o tópico http://www.autolisp.com.br/autolisp/mod ... tra+pontos)

[lsp];;;Função que altera o conteúdo de variáveis globais passadas por parâmetro em formato de string
(defun incrementa (v1 v2 / )
(set v1 (+ (eval (read v1)) 10))
(set v2 (+ (eval (read v2)) 20))
)
;;;Variáveis Globais
(setq
s1 10
s2 20
)
;;;Forma de chamada á função
(incrementa "s1" "'s2")
;;;Teste do resultado
(princ s1)
(terpri)
(princ s2)[/lsp]
Marcelo Silva - Cascavel - PR
cracksther@gmail.com
Avatar do usuário
admin
Administrador
Administrador
Mensagens: 621
Registrado em: Sex 28 Nov 2003 11:00:00 pm
Localização: Itu / SP
Contato:

Mensagem por admin »

não poderiamos resolver assim?

[lsp]
;;;Função que altera o conteúdo de variáveis globais passadas por parâmetro em formato de string
(defun incrementa (v1 v2 / )
(setq v1 (+ v1 10))
(setq v2 (+ v2 20))
(list v1 v2)
)
;;;Variáveis Globais
(setq
s1 10
s2 20
)
;;;Forma de chamada á função
(setq res (incrementa s1 s2))
;;;Teste do resultado
(setq s1 (nth 0 res))
(setq s2 (nth 1 res))
(princ s1)
(terpri)
(princ s2)
[/lsp]

Quando for muitas variáveis pode ser mais fácil (não mais rápido)
Toda função retorna apenas um parametro. Mas este parâmetro pode ser uma lista!
Entendo que a sua versão está em um nível de depuração e otimização que considero alto. Este modo é ideal para gerar um aplicativo compilado onde o código não será lido por mais ninguem. Mas se for compartilhar o código com outras pessoas .. muitos não irão se atrever a encostar a mão nestas linhas de programação ou vão demorar muito para entender.

Mas gostei mesmo!
Marcos Mendes de Almeida
mmalbr@gmail.com
Avatar do usuário
cracksther
Diamante
Diamante
Mensagens: 1063
Registrado em: Seg 13 Dez 2004 11:00:00 pm

Mensagem por cracksther »

marcos... Concordo com você que o código escrito de tal forma não é assim tão fácil de entender, no entanto quiz apenas mostrar um recurso da linguagem que praticamente não é usado... Se um dia for implementar um programa com um certo grau de inteligência artificial vera que estes recursos são bastante úteis... Alé de diminuir a quantidade de código em alguns casos.

Até mais!
Marcelo Silva - Cascavel - PR
cracksther@gmail.com
Responder