Array que não para de crescer

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Array que não para de crescer

Mensagem por rossine »

Olá pessoal,

Somente gostaria de comentar com vocês um erro que estava ocorrendo aqui mas que nunca tinha percebido ele e fica de alerta aí pra turma:

Vejam o exemplo abaixo:

Código: Selecionar todos

#include "hbclass.ch"

function main

local a := { 1, 2 }
local b
local aVar
local aVar2
local oClass

// Usando com variáveis SIMPLES, funciona sem problemas.

cls

b := a

a := { 3, 4 }

? "Devera mostrar { 3, 4 }", hb_valtoexp( a )

? "Devera mostrar { 1, 2 }", hb_valtoexp( b )

// Usando CLASSES, o valor de AVAR é mudado, mas reparem que a variável
// que mandei na classe foi AVAR2

aVar  := { "Um", "dois", "tres" }
aVar2 := aVar

? ""
? ""
? ""

? "Conteudo de aVar ANTES de executar a classe", hb_valtoexp(aVar)

oClass := TCLASS():New( aVar2 )

? "Conteudo de aVar DEPOIS de executar a classe", hb_valtoexp(aVar) // Vejam que mudou o valor do Avar

? "Conteudo de aVar2", hb_valtoexp(aVar2)

? ""
? ""
? "A solucao eh usar ACLONE()"
? ""
? ""

aVar  := { "Um", "dois", "tres" }
aVar2 := aclone( aVar ) // Aqui está a charada

? "Conteudo de aVar ANTES de executar a classe", hb_valtoexp(aVar)

oClass := TCLASS():New( aVar2 )

? "Conteudo de aVar DEPOIS de executar a classe", hb_valtoexp(aVar) // Vejam aqui que o valor de Avar nao mudou

? "Conteudo de aVar2", hb_valtoexp(aVar2)

return NIL

//----------------------//

CLASS TCLASS

   DATA aItems

   METHOD New

ENDCLASS

METHOD New( aItems )

  aadd( aItems, "Novo" )

return SELF

Cuidado ao passarem variáveis para as classes e dentro da classe, mudar o valor dela pois fora o valor também será mudado.

Sempre aprendendo....

Fica aí a dica,

T+

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Array que não para de crescer

Mensagem por rossine »

Olá,

Por um erro na digitação o exemplo ficou errado. As linhas abaixo tem que ficar assim:

de:

Código: Selecionar todos

   DATA aItems
...
  aadd( aItems, "Novo" )
para:

Código: Selecionar todos

   DATA aItems INIT { }
...
  aadd( ::aItems, "Novo" )
...com esta correção, o valor final de aVar fica correto.

Mas achei interessante que, quando aItem era do tipo private, aVar estava herdando o valor definido dentro da classe.

T+

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Array que não para de crescer

Mensagem por JoséQuintas »

Tem que tomar cuidado com uma coisa:
Por padrão, o array é passado por referência, como se fosse Funcao( @array ).
E modificar o array dentro da função/classe, altera a original.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Array que não para de crescer

Mensagem por rossine »

José,

Boa observação, tinha me esquecido deste detalhe.

Obrigado.

Rossine.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Array que não para de crescer

Mensagem por alxsts »

Olá!

Este comportamento se relaciona a um assunto chamado "detached local variables"
[]´s
Alexandre Santos (AlxSts)
rossine
Usuário Nível 3
Usuário Nível 3
Mensagens: 325
Registrado em: 06 Ago 2007 09:57
Localização: Divinópolis-MG

Array que não para de crescer

Mensagem por rossine »

Alexandre,

Obrigado pelo link.
Rossine.

Harbour 3.4, MingW / Msvc, QT, Qt5xhb, GtQtc, DbfCdx, MySql/MariaDB.
Responder