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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 3110
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