Página 1 de 1

Array que não para de crescer

Enviado: 25 Ago 2015 17:41
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.

Array que não para de crescer

Enviado: 25 Ago 2015 22:01
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.

Array que não para de crescer

Enviado: 27 Ago 2015 17:13
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.

Array que não para de crescer

Enviado: 27 Ago 2015 19:17
por rossine
José,

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

Obrigado.

Rossine.

Array que não para de crescer

Enviado: 28 Ago 2015 00:35
por alxsts
Olá!

Este comportamento se relaciona a um assunto chamado "detached local variables"

Array que não para de crescer

Enviado: 28 Ago 2015 13:43
por rossine
Alexandre,

Obrigado pelo link.