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

Código: Selecionar todos

...
cTexto := pesquisa()
? QualDado( cTexto )
? cNome
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:

Código: Selecionar todos

public nomevar := space(50)
Seria a mesma coisa que:

Código: Selecionar todos

nomevar := space(50)
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.