Página 1 de 1
Como mandar variaveis locais para outra função???
Enviado: 08 Jan 2007 09:25
por Romega
To precisando de uma ajuda ai pessoal...
Não to conceguindo passar variaveis locais de uma função para outra, no mesmo arquivo ".prg".
Será q alguem poderia me da uma esplicação de como isso funciona??
Desde já agradeço...
Enviado: 08 Jan 2007 10:44
por rochinha
Amiguinho
Variaveis LOCAL como o proprio nome diz residem dentro da função ou procedure.
Voce pode até usar a mesma variavel em várias funções mas não é recomendado.
Se voce precisa passar variaveis para outra função torne-as PUBLIC ou passe-as como parametro:
Exemplos:
Código: Selecionar todos
function teste1()
public cVariavel
cVariavel := "Rochinha"
return .t.
Function teste2
? cVariavel
return .t.
teste1()
teste2()
Código: Selecionar todos
function teste1()
local cVariavel
cVariavel := "Rochinha"
return cVariavel
Function teste2( cConteudo )
? cConteudo
return .t.
teste2( teste1() )
Enviado: 08 Jan 2007 11:58
por Romega
O que eu quero fazer é executar uma função e de dentro dessa, chamar uma 2º e depois voltar para 1º... E essa 2º função faria uso de variaveis (e seus valores) da 1º função, usaria as informações para gavar no banco. Então eu deveria passar as variaveis da 1º função para a 2º via parametros...
Mais como funciona a passagem via parametros?
Desde já agradeço...
Enviado: 08 Jan 2007 12:28
por rochinha
Amiguinho
Supondo que voce criou uma função de pesquisa numa tabela e quer ver o resultado:
Código: Selecionar todos
function pesquisa()
public cNome := "Rochinha"
local cVariavel := space(30), cMensagem := "Nao encontrei"
@ 0,0 say "Nome: " get cVariavel picture "@!X"
read
select arquivo
dbSeek( cVariavel )
if .not. found()
cVariavel := cMensagem
else
cVariavel := arquivo->campo
endif
return cVariavel
Function QualDado( cTexto )
Alert( cMensagem )
return NIL
No exemplo passado minha funcao de pesquisa simula uma verificacao num banco de dados e pesquisa um nome e caso o encontre retorna como resultado da função QualDado().
Veja que Pesquisa() passa para dbSeek() um parametro e o mesmo retorna uma critica, .f. ou .t. e dependendo de seu conteudo preencho a variavel local cVariavel com um texto e na saida da função retorno este valor. A variavel cVariavel fica contida dentro desta função e não sera possivel ver seu conteudo fora dela.
Em contra-partida a variavel cNome pode ser apresentada em qualquer local do programa até que seja editada.
Veja que em dado momento passo o resultado de Pesquisa() para a função QualDado() com parametro e a mesma repassa este valor para Alert() que mostra pra voce na tela.
Então voce pode perceber que a passagem de parametro e o recebimento de resultados depende de como sua função foi desenhada.
A função pesquisa foi desenhada para retornar um valor enquanto que a função QualDado nunca retornará algo que não seja NIL ou .T.
Se mesmo assim tiver duvidas poste o trecho de seu codigo para analisarmos e darmos nosso parecer.
Enviado: 08 Jan 2007 13:07
por Romega
No seu exemplo, vc usou o ultimo parametro de uma função (return) para fazer as passagens das variaveis. Mas no meu caso, não da pra faze isso pq eu invoco a 2º função no meio da 1º, ou seja, a primeira ainda não acabou e por isso não posso passar as variaveis usando o "return" da 1º.
Não da pra faze alguma coisa do como:
Código: Selecionar todos
set key K_F4 to savreg ( variavel1, variavel2, variavel3 )
No caso, atribui uma função a tecla F4 q pode ser precionada a qualquer momento e irá chamar a função savreg passando as variaveis mencionadas para ela...
Se o unico meio for atraves do "return", entao vou ter q fazer de outra maneira...
O q quero fazer é algo do genero:
Código: Selecionar todos
function cadastro
local op := space(1)
local varnome := space(50)
@ 10,10 say "Nome: "get varnome
@ 11,10 say "Deseja salvar? Sim ou Não " get op
read
if op="s"
to savreg ( varnome ) //chamaria a função savreg repassando a variavel varnome
else
exit
end if
return
function savreg
//Salvaria a variavel "varnome" no banco...
return
Seria alguma coisa parecida com isso...
Mais assim como tá nao funciona, gostaria de saber um geito semelhante que eu possa usar...
Valeu pela ajuda...
Enviado: 08 Jan 2007 13:28
por rochinha
Amiguinho
Faça as alterações:
Código: Selecionar todos
function cadastro
local op := space(1)
PUBLIC varnome := space(50) // coloque a variavel como PUBLICa
@ 10,10 say "Nome: "get varnome
@ 11,10 say "Deseja salvar? Sim ou Não " get op
read
if op="s"
savreg ( varnome ) //chamaria a função savreg repassando a variavel varnome
// Apenas coloque savreg()
else
exit
end if
return
function savreg
//Salvaria a variavel "varnome" no banco...
replace campo with varnome
return
Enviado: 08 Jan 2007 13:45
por Romega
Ta, mais se a variavel for PUBLICA, não precisaria repassa-la na chamada da 2º função, pois as publicas funcionam em qualquer lugar.
E as variaveis q nao recebem declarações como locais ou publicas ou outra coisa, são PUBLICAS por defalt em Clipper não é?
No caso:
Seria a mesma coisa que:
Pois ambas funcionariam em qualquer lugar...
Ou estou enganado???
Valeu...
Enviado: 08 Jan 2007 14:09
por Toledo
Romega, use variável PRIVATE...
Veja um exemplo:
Código: Selecionar todos
clear
v1 = 1
@ 1,10 say "PRG inicial - Variavel v1 = "+str(v1,2,0)
funcao1()
@ row()+2,10 say "PRG inicial - Variavel v2 = "+str(v2,2,0)
//nesta linha vai dar erro, pois v2 não existe no PRG inicial
retu
func funcao1()
private v2:=2
@ row()+2,10 say "Funcao 1 - Variavel v1 = "+str(v1,2,0)
@ row()+2,10 say "Funcao 1 - Variavel v2 = "+str(v2,2,0)
funcao2()
@ row()+2,10 say "Funcao 1 - Retorno Variavel v2 = "+str(v2,2,0)
retu nil
func funcao2()
@ row()+2,10 say "Funcao 2 - Entrada Variavel v2 = "+str(v2,2,0)
v2+=1
retu nil
O resultado será o seguinte:
Código: Selecionar todos
PRG inicial - Variavel v1 = 1
Funcao 1 - Variavel v1 = 1
Funcao 1 - Variavel v2 = 2
Funcao 2 - Entrada Variavel v2 = 2
Funcao 1 - Retorno Variavel v2 = 3
// Aqui vai dar erro, v2 não existe.
Resumindo: a variável v1 pode ser usada no prg todo, agora v2 pode ser usada na função 1 que criou ela, bem como nas outras funções que forem chamadas a partir da função 1, neste exemplo a função 2. Mas quando a função 1 retornar para o prg inicial, a variável v2 deixa de existir.
Abraços,
Enviado: 08 Jan 2007 14:28
por rochinha
Amiguinho
Se na abertura do programa voce colocou uma variavel e nao especificou nenhum tipo ela será PUBLICa e o valor default poderá ser NIL ou .f.
Mas no momento que voce redeclara a mesma variavel com LOCAL ao fechar a função em que ela foi LOCALizada ela vai pro saco.
Nao tem por que voce declarar uma mesma variavel com vários tipos e valores, uma hora local outra publica ou numerica e depois caracter. Voce nao tem limite de variaveis para refazer a tipagem.
Mas pelo fato de não ter limite não quer dizer que voce não coloque inteligencia em seu aplicativo de forma que ele saiba o tipo e valor das variaveis e possa até te apresentar qual sua funcionalidade.
Use variaveis LOCAL somente se ela forem usadas em dado momento, pois as mesmas serão descartadas no final da função liberando recursos de memória.
Use variaveis PUBLIC somente se as mesmas necessitarem conter um valor
imutável por todo o processo do aplicativo. Alterar o conteudo de uma variavel global pode te trazer problemas.
Referencie corretamente e diferencie suas origens:
Para variaveis de conteúdo use M-> como sinalizador
Para variaveis de campo use ARQUIVO-> ou _FIELD-> como sinalizador
Exemplö:
Código: Selecionar todos
use ARQUIVO
M->nome := ARQUIVO->nome
...
@ ..,.. get M->nome ...
...
replace ARQUIVO->nome with M->nome
Exemplo:
Código: Selecionar todos
procedure main
PublicaGETs()
CarregaGETs()
...
@ ..,.. get M->nome ...
...
SalvaGETs()
EliminaGETs()
return
Function PublicaGETs()
PUBLIC nome
return .t.
Function CarregaGETs()
M->nome := ARQUIVO->nome
return .t.
Function SalvaGETs()
replace ARQUIVO->nome with M->nome
return .t.
Function EliminaGETs()
RELEASE nome
return .t.
Enviado: 08 Jan 2007 15:34
por Romega
Valeu pessoal...
A declaração "private" é exatamente o que eu precisava. Já conhecia mais não sabia pra que servia na pratica.
Andei dando uma olhada no Norton Guide 5.0 portugues e é isso mesmo q eu precisava.
Testei e resolvel meu problema...
Valeu pela força pessoal

)
Enviado: 08 Jan 2007 17:43
por gvc
Só para acompanhar o tema.
Se vc quer passar o valor de uma variável para uma procedura/função, voce fará assim:
...
local a1
a1 := 5
...
funcao1(a1) // passagem por valor
? a1 // imprime 5
...
function funcao1(q_valor)
...
q_valor := 3
...
return(Nil)
Se for necessário usar o valor da variável dentro da função e mudá-lo, vc deverá fazer isto:
...
funcao1(@a1) // Passagem por referência.
? a1 // imprime 3
...
Vc tb deverá passar por referência se tiver que passar um array para a sua função.