Clipper On Line • Ver Tópico - Problema com variável static

Problema com variável static

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Problema com variável static

Mensagempor asimoes » 31 Out 2009 23:15

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.
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Re: Problema com variável static

Mensagempor Toledo » 01 Nov 2009 00:27

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,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Re: Problema com variável static

Mensagempor asimoes » 01 Nov 2009 08:30

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.

//
// $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} )


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


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
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Re: Problema com variável static

Mensagempor Maligno » 01 Nov 2009 09:28

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.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar de usuário

Maligno
Membro Master

Membro Master
 
Mensagens: 6390
Data de registro: 06 Jul 2004 01:40
Cidade/Estado: Londrina/PR
Curtiu: 1 vez
Mens.Curtidas: 14 vezes

Re: Problema com variável static

Mensagempor asimoes » 01 Nov 2009 20:02

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
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro