Passagem de parâmetros por referência - Fórum - Autolisp
Autolisp Tudo para o seu AutoCAD AutoLISP Desafio
Mais um da série desafios...
Mensagem por cracksther » Sáb 15 Nov 2008 2:11:48 pm
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:
(defun soma (x / )
(setq x (+ x 10))
(princ "\nA soma é: ")
)[/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.
Editado pela última vez por cracksther em Qua 18 Fev 2009 12:47:55 pm, em um total de 1 vez.
Mensagem por laudemir » Dom 16 Nov 2008 1:58:15 pm
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...........
"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....
Mensagem por cracksther » Seg 17 Nov 2008 8:15:13 am
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...
Mensagem por cracksther » Ter 18 Nov 2008 8:42:03 am
Impressionante como um recurso tão útil nas poderosas C/C++ e Win32 API passa praticamente despercebido em AutoLISP.
[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
;;;Forma de chamada á função
(incrementa 's1 's2)
;;;Teste do resultado
(princ s1)
(princ s2)[/lsp]
Espero que seja útil para mais alguém além de mim.
Mensagem por cracksther » Ter 18 Nov 2008 8:47:36 am
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
(set v1 (+ (eval (read v1)) 10))
(set v2 (+ (eval (read v2)) 20))
(incrementa "s1" "'s2")
Mensagem por admin » Ter 18 Nov 2008 9:09:59 am
não poderiamos resolver assim?
;;;Função que altera o conteúdo de variáveis globais passadas por parâmetro em formato de string
(setq v1 (+ v1 10))
(setq v2 (+ v2 20))
(list v1 v2)
(setq res (incrementa s1 s2))
(setq s1 (nth 0 res))
(setq s2 (nth 1 res))
(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!
mmalbr@gmail.com
Mensagem por cracksther » Ter 18 Nov 2008 12:25:45 pm
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.