Página 1 de 2

Usar objetos

Enviado: 17 Jul 2023 13:55
por JoséQuintas
Tem muita briga de LIB, lib isso, lib aquilo, objeto, não objeto.....

E coisa importante, nada....

Uma coisa que nunca saiu da minha cabeça:

Código: Selecionar todos

x := Space(1000000000)
funcao( x )
Isso acima cria a variável grande, e repassa pra função, ocupando o dobro do espaço.

E com classes/objetos ? o que acontece ?
O objeto vai ser multiplicando conforme vai passando por funções ?

Pois é... não importa a lib... é uma informação muito interessante.
Não faço idéia da resposta.

Será que é igual array? que entra como referência automaticamente?
E mesmo array, não é exatamente igual passar variável por referência... talvez seja interessante usar de outro jeito.

Usar objetos

Enviado: 18 Jul 2023 16:03
por Kapiaba
Mister Quintas, eu não entendi ONDE ESTÁ o OBJETO neste seu exemplo. Para mim, isto é APENAS uma VARÁVEL LOCAL.

Para mim, OBJETO é isso. Por exemplo:

Código: Selecionar todos


   LOCAL aGet := ARRAY(10), cVar1,,, etc.
   LOCAL oBotao1 // Objeto do Botao 1

   REDEFINE GET aGet[1] VAR cVar2...

   REDEFINE GET aGet[2] VAR cVar3..

   REDEFINE GET aGet[3] VAR cVar4..

   REDEFINE GET aGet[4] VAR cVar5..

   REDEFINE GET aGet[5] VAR cVar6..

   REDEFINE BUTTON oBotao1 ID 301 OF oDlg(objeto do dialogo(etc)
   
etc
Como não entendi o que quisetes dizer, explique-se melhor e o que uma .LIB tem com isso.

So sorry.

Abs.

Usar objetos

Enviado: 18 Jul 2023 16:16
por JoséQuintas
O fonte é exemplo de como passar por parâmetro pode gastar muita memória sem se perceber, e o exemplo usa string.

E o que acontece com objetos?

Código: Selecionar todos

x := x():New()
x:y := Space(1000)
funcao( x )
...


CLASS x
   VAR y
   ENDCLASS

Usar objetos

Enviado: 20 Jul 2023 12:59
por Kapiaba
Continuo sem entender onde está o OBJETO no seu exemplo.
Pode por gentileza fazer um EXEMPLO prático explicando o que queres dizer exatamente?
Eu hein....

Isto são objetos:

Código: Selecionar todos

   LOCAL oBtnImp     AS OBJECT
   LOCAL oDlgImp     AS OBJECT
   LOCAL oFnt        AS OBJECT
   LOCAL oFont       AS OBJECT
   LOCAL oSaida      AS OBJECT
   LOCAL oGroup      AS OBJECT
   LOCAL oAprovado   AS OBJECT
   LOCAL oIndeferido AS OBJECT
   LOCAL oPendente   AS OBJECT
   LOCAL oImpGeral   AS OBJECT
   LOCAL oCobrado    AS OBJECT
   LOCAL DeOndeVemImp, aGrad // variaveis comuns.
Regards, saludos.

Usar objetos

Enviado: 20 Jul 2023 15:00
por Itamar M. Lins Jr.
Olá!
Continuo sem entender onde está o OBJETO no seu exemplo.
Qualquer coisa é objeto.
Mas quando falamos objeto é pq estamos usando OOP. CLASSES e dentro os MÉTODOS!
Dizer que "VariavelTal as object" é que não quer dizer nada para quem programa.
Qual é a diferença "VariavelTal as object" para "VariavelTal as numeric" ?
Isso é só declaração de variáveis sem conteúdo nenhum.

No exemplo do Quintas o objeto é o X que é uma CLASSE também, entendeu ?
x := X():New() -> x é um objeto que chama a classe X...

Saudações,
Itamar M. Lins Jr.

Usar objetos

Enviado: 20 Jul 2023 17:34
por JoséQuintas

Código: Selecionar todos

#include "inkey.ch"
#include "hbgtinfo.ch"
#include "hbclass.ch"

REQUEST HB_CODEPAGE_PTISO

PROCEDURE Main

   LOCAL nKey := 0, x


   SET EVENTMASK TO INKEY_ALL - INKEY_MOVE
   Set( _SET_CODEPAGE, "PTISO" )

   SetMode(36,132)
   SetColor( "W/B" )
   CLS
   ? Memory(1001)
   x := QualquerClasse():New()
   x:y := Space(100000000)
   ? Memory(1001)
   z( x )
   ? Len( x:y )
   z( x )
   ? Memory(1001)
   hb_ThreadStart( { || DispOut( Memory(1001) ), z( x:y ), DispOut( Memory(1001) ) } )
   hb_ThreadStart( { || DispOut( Memory(1001) ), z( x:y ), DispOut( Memory(1001) ) } )
   hb_ThreadStart( { || DispOut( Memory(1001) ), z( x:y ), DispOut( Memory(1001) ) } )

   DO WHILE nKey != K_ESC
      nKey := Inkey(0)
   ENDDO

   RETURN

CREATE CLASS QualquerClasse
  VAR y
  ENDCLASS

FUNCTION z( x )

   LOCAL k

   k := x

   (k)

   ? Memory(1001)

   RETURN x
test.png
Se alguém conseguir interpretar isso, porque não entendi nada.

Usar objetos

Enviado: 20 Jul 2023 17:42
por JoséQuintas

Código: Selecionar todos

   ? Memory(THISTEST)
   x := Array(20)
   AFill( x, Space(100000000) )
   ? Memory(THISTEST)

   DO WHILE nKey != K_ESC
      nKey := Inkey(0)
   ENDDO

   RETURN
Ou isso acima.
Uso de 2GB de memória e não faz diferença.

Usar objetos

Enviado: 20 Jul 2023 17:45
por JoséQuintas
test.png
Sei lá, não estou entendendo nada.

Usar objetos

Enviado: 20 Jul 2023 17:52
por JoséQuintas
test2.png
2GB ocupando 100MB ?
Tô ficando doido?

Usar objetos

Enviado: 20 Jul 2023 17:59
por JoséQuintas
test.png
10.000 elementos de 100MB, 1.000 GB, em 100MB de memória?
O que estou fazendo de errado?
1 trilhão de bytes.

Usar objetos

Enviado: 20 Jul 2023 18:13
por JoséQuintas
testx.png
São 10.000 elementos, salvei um, tá lá no disco com 100MB
10.000 x 100.000.000 = 1 trilhão, é o que mostra lá testando o Len()
Os 10.000 não cabem nem no HD
O limite de memória 32 bits não comportaria isso.
Tô enxergando direito?

Será que o computador tá possuído?

Usar objetos

Enviado: 21 Jul 2023 13:32
por JoséQuintas
Alguém pode confirmar esses cálculos?

Como o Harbour pode armazenar 1 TERABYTE de informação em 100 MB de memória ?

Pra mim, se meus cálculos estiverem corretos, algo muito estranho nisso, ainda mais se considerar 32 bits do harbour, que limita uso de memória.

Me veio na cabeça aqueles problemas aleatórios que eu e outras pessoas já comentamos por aqui.

Será que o harbour está misturando tudo quando estoura a memória ?

Por isso tentando entender, e torcendo para meus cálculos estarem errados, ou que exista algum motivo pra isso.

Usar objetos

Enviado: 21 Jul 2023 15:40
por JoséQuintas
Sei lá.... tanto faz o teste....

Código: Selecionar todos

   x := Array(1000000)
   AFill( x, Space(100000000) )
   FOR EACH i IN x
      t += Len( i )
   NEXT
   ? Transform( t, "999,999,999,999,999" )
   hb_MemoWrit( "um.x",x[1] )
1 milhão de elementos de 100MB
100 terabytes, e continua funcionando, e ocupando só 100mb de memória.
Se for assim, salvar toda coleção de filmes em memória e fazer backup da memória.

Usar objetos

Enviado: 21 Jul 2023 15:48
por JoséQuintas

Código: Selecionar todos

   CLS
   DO WHILE nKey != K_ENTER
      x += x
      ? Transform( Len( x ), "9,999,999,999,999,999" )
      nKey := Inkey(1)
   ENDDO
Desse jeito dá erro, por volta de 400mb, não sei dizer direito, porque a janela se fecha.
d:\temp>type hb_out.log
Application Internal Error - d:\temp\test.exe
Terminated at: 2023-07-21 16:00:52
Unrecoverable error 9009: hb_xrealloc can't reallocate memory
Called from MAIN(21) in test.prg
Mas como array não dá erro nunca.
Quem sabe não encontrei o problema.....

Usar objetos

Enviado: 22 Jul 2023 06:03
por marcosgambeta
José,

Atente pare este detalhe: você está fazendo testes com strings VAZIAS.

Experimente colocar conteúdo nas strings e observe os resultados.

Inicie com valores menores e vá aumentando, observando o consumo de memória.