Página 1 de 1
Problema com variável static
Enviado: 01 Nov 2009 00:15
por asimoes
Senhores,
Estou com um problema com atribuição a variável static com a vsersão harbour da minigui.
Atribuo um valor : ex. static cValor:="1" esta variável deveria estar sendo vista por todo o sistema, mas não é o que acontece, nas funções que eu preciso usar a variável o sistema entra em erro informando que a variável não existe.
Re: Problema com variável static
Enviado: 01 Nov 2009 01:27
por Toledo
Olá asimoes, as variáveis estáticas (static) são iguais as variáveis locais, só são visíveis na rotina em que foram criadas. A única diferença é que o valor da variável estática não se perde durante a chamada de outros rotinas, elas se mantem até que a rotina que a criou seja encerrada.
Para que uma variável seja vista em todo o programa, você tem que declarar ela como PUBLIC ou como PRIVATE no programa (PRG) inicial.
Abraços,
Re: Problema com variável static
Enviado: 01 Nov 2009 09:30
por asimoes
Olá Toledo,
O que você me diz destes exemplos do harbour:
Estes exemplos estão na pasta \trunk\harbour\tests
Note que a variável static z := "First" (no exemplo abaixo) está sendo inicializada no inicio, fora de qualquer function, e sendo usada na function NumStat()
me corrija se estiver errado.
Código: Selecionar todos
//
// $Id: statics.prg 1519 1999-10-04 18:46:41Z vszel $
//
// Testing Harbour statics variables management
static z := "First"
function Main()
LOCAL i, cb
static a := "Hello", b := { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
QOut( a )
QOut( b[ 2 ] )
Two()
QOut( "Ok!" )
FOR i:=1 TO 10
NumStat()
NEXT
cb :=DetachVar( 10 )
FOR i:=1 To 10
QOut( EVAL( cb, b[ i ] ) )
NEXT
return nil
function Two()
static a := "Test"
QOut( a )
return nil
FUNCTION THREE( p )
QOut( p )
RETURN p
PROCEDURE NumStat(a)
STATIC n:=1
LOCAL cb
//STATIC m:=n //uncomment it to see an error
//STATIC m:=Time() //uncomment it to see an error
cb :={|x| z +STR(x)}
QOut( ++n )
QOut( EVAL( cb,n ) )
RETURN
FUNCTION DetachVar( xLocal )
STATIC xStatic:=100
RETURN( {|x| ++xStatic, x+xStatic+xLocal} )
Código: Selecionar todos
static uOne, uTwo
function Main()
QOut( "Statics overlapped!" )
QOut( "===================" )
QOut( "" )
QOut( "INSIDE statics1.prg" )
QOut( " static uOne, uTwo" )
QOut( "" )
QOut( " uOne, uTwo =>", uOne, ",", uTwo )
uOne := 1
uTwo := 2
QOut( " uOne := 1" )
QOut( " uOne := 2" )
QOut( " uOne, uTwo =>", uOne, ",", uTwo )
QOut( "" )
Test()
QOut( "INSIDE statics1.prg" )
QOut( " uOne, uTwo =>", uOne, ",", uTwo )
QOut( "" )
return nil
Código: Selecionar todos
static uA, uB
function Test()
QOut( "INSIDE statics2.prg" )
QOut( " static uA, uB" )
QOut( "" )
QOut( " ValType( uA ), ValType( uB ) =>", ValType( uA ), ",", ValType( uB ) )
QOut( " uA, uB =>", uA, ",", uB )
uA := "a"
uB := "b"
QOut( ' uA := "a"' )
QOut( ' uB := "b"' )
QOut( " uA, uB =>", uA, ",", uB )
QOut( "" )
return nil
Re: Problema com variável static
Enviado: 01 Nov 2009 10:28
por Maligno
O escopo de uma variável STATIC é de alcance limitado a todo o arquivo fonte se declarada antes de qualquer FUNCTION ou PROCEDURE. O escopo se torna local a um função se declarada dentro dela, não se expandindo às funções chamadas, como acontece com variáveis PRIVATE. Uma variável STATIC nunca tem escopo global.
A variável PUBLIC, por outro lado, tem escopo global, e por definição é STATIC também, haja vista que seu valor se perde apenas quando fora de escopo, ou seja, quando o programa finaliza. Mas em situações especiais, seu alcance se perde temporariamente, quando uma variável de mesmo nome, local, é definida. E se torna visível novamente quando essa segunda variável morre.
Em suma: sua variável STATIC não tem escopo global mesmo, e não pode ser vista em todo programa. No máximo, em todo arquivo fonte em que foi definida. Para resolver seu problema, você terá de usar uma variável PUBLIC. Ou, conforme o caso, uma variável PRIVATE definida dentro da primeira função do programa.
Re: Problema com variável static
Enviado: 01 Nov 2009 21:02
por asimoes
Senhores,
O problema está resolvido.
É o seguinte, tenho um sistema feito em xharbour/minigui e queria gerar este sistema em harbour, escolhi o xdev (já estava na hora de aprender) para gerar.
Configurei o xdev para usar minigui e harbour, o xdev (excelente ferramenta) gerou o meu sistema mas estava dando erro em uma variável do tipo static que eu uso para controlar uma operação. Esta variável está no inicio da minha aplicação, antes da function main. Estava quase desistindo da static e passando a declarar esta como private na function main. Mas ai veio a pergunta, porque em xharbour gera o executável e não dá erro? Fui verificar nos samples da minigui e achei vários exemplos usando static da forma como eu queria, usei a bat compile.bat destes exemplos os exemplos funcionaram sem erro com a static.
Fui então vasculhar como a compile.bat funciona, descobri que esta usa a instrução -n para o harbour, no xdev em configurar compiladores selecionados
Marquei para S em Não definir função inicial automática. Beleza, funcionou!
[]´s