Como usar a função ACopy()

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

Moderador: Moderadores

Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Como usar a função ACopy()

Mensagem por Jairo Maia »

Olá Pessoal,

Alguém sabe como usar essa função?:

ACopy( <aSource>, <aTarget>, [<nSourceStart>], [<nCount>], [<nTargetStart>] ) --> aTarget

Código: Selecionar todos

Function Main()
 Local x, aDados:={}, aDadosPrint:={}, nElementos:=100
 
 For x = 1 To nElementos
  AaDd( aDados, "Elemento " + Hb_NToS( x ) )
 Next
 
 Clear Screen
 
 ?
 ? Len( aDados )
 
 //ACopy( aDados, aDadosPrint, 1, Len( aDados ) - 4, 1 )  // não funciona,
 aDadosPrint := ACopy( aDados, aDadosPrint, 1, Len( aDados ) - 4, 1 )    // e não funciona
 
 ?
 ? Len( aDadosPrint )
 
Return Nil
A solução foi usar ASize(), mas não entendo porque ACopy() não funciona.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Como usar a função ACopy()

Mensagem por Toledo »

Jairo, veja o que o help desta função diz:
O processo de cópia é concluído quando os elementos <nCount> são copiados ou o último elemento em um dos dois arrays é atingido. Se a matriz de origem contiver mais elementos que a matriz de destino, a cópia será interrompida quando o último elemento da matriz de destino for atingido e vice-versa. O número de elementos em ambos os arrays não é alterado por ACopy ().
Então, como no seu exemplo aDadosPrint:={} não tem elemento nenhum, não será copiado nada. Neste caso aDadosPrint:={} teria que ter o mesmo número de elementos de aDados:={}, ou pelo menos o número de elementos que você quer copiar de aDados para aDadosPrint.
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
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Como usar a função ACopy()

Mensagem por gilbertosilverio »

Ola Jairo,

Acho que acopy(), concatena matriz, ela copia de uma para outra...

Não e isso?

Olha o help do Harbour.
Anexos
Capturar.JPG
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Como usar a função ACopy()

Mensagem por Kapiaba »

Buenas, não entendi a utilidade deste comando.

Código: Selecionar todos

#include "FiveWin.ch"

FUNCTION Main()

   LOCAL nCount := 2, nStart := 1, aOne, aTwo, cResult

   aOne := { "HARBOUR", " IS ", "POWER"}

   aTwo := { "CLIPPER", " WAS ", "POWER"}

   ACopy( aOne, aTwo, nStart, nCount )

   // ?  aOne[1], aOne[2], aTwo[1]  // harbour is power.

   cResult :=  HB_ValToExp( aTwo )

   ? cResult

RETURN NIL
Obg. abs.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Como usar a função ACopy()

Mensagem por Kapiaba »

E este?

Código: Selecionar todos

#include "FiveWin.ch"

FUNCTION Main()

   LOCAL aOne, aTwo

   aOne := { "Harbour"," is ","POWER" }

   aTwo := AClone( aOne )       // Result: aTwo is {"Harbour"," is ","POWER"}

   aOne[ 1 ] := "The Harbour Compiler"

   // Result:
   // aOne is { "The Harbour Compiler", " is ", "POWER" }
   // aTwo is { "Harbour"," is ","POWER" }

RETURN NIL
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Como usar a função ACopy()

Mensagem por asimoes »

No fonte da hbmk2 tem essa function usando acopy

Código: Selecionar todos

STATIC FUNCTION ArrayJoin( arraySrc1, arraySrc2 )

   LOCAL arrayNew := AClone( arraySrc1 )
   LOCAL nLen1 := Len( arrayNew )

   ASize( arrayNew, nLen1 + Len( arraySrc2 ) )

   RETURN ACopy( arraySrc2, arrayNew, , , nLen1 + 1 )
►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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Como usar a função ACopy()

Mensagem por asimoes »

Pesquisando mais na 3.4

Fonte: rt_array.prg

HBTEST TAStr( ACopy( TARng(), TANew(), 21 ) ) IS ".........." /* Bug in CA-Cl*pper, it will return: "J.........", fixed in 5.3a */
►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 do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Como usar a função ACopy()

Mensagem por asimoes »

Vai copiar até o 4 elemento

Código: Selecionar todos

   nCont := 0
   aSource := {1,2,3,4,5,6,7,8,9,10}
   aTarget := {}
   aEval( aSource, { |x| nCont++, If( nCont < 5, aAdd( aTarget, x ), 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 do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Como usar a função ACopy()

Mensagem por Jairo Maia »

Olá Pessoal,

Obrigado a todos!
Toledo escreveu:Jairo, veja o que o help desta função diz:

O processo de cópia é concluído quando os elementos <nCount> são copiados ou o último elemento em um dos dois arrays é atingido. Se a matriz de origem contiver mais elementos que a matriz de destino, a cópia será interrompida quando o último elemento da matriz de destino for atingido e vice-versa. O número de elementos em ambos os arrays não é alterado por ACopy ().
Isso mesmo. Eu não estava entendendo essa parte. Agora funciona:

Código: Selecionar todos

Function Main()
 Local x, aDados:={}, aDadosPrint:={}, nElementos:=100
 
 For x = 1 To nElementos
  AaDd( aDados, "Elemento " + Hb_NToS( x ) )
 Next
 
 Clear Screen
 
 ?
 ? Len( aDados )
 
 aDadosPrint := Array( Len( aDados ) - 4 )  // coloca o número de elementos desejado na matriz...
 
 aDadosPrint := ACopy( aDados, aDadosPrint )  // assim funcionou...
 
 ?
 ? Len( aDadosPrint )
 ?
 ? Atail( aDadosPrint )
 ?
 
Return Nil
gilbertosilverio escreveu:Acho que acopy(), concatena matriz, ela copia de uma para outra...
Sim. Mas entendi isso somente agora.
Kapiaba escreveu:Buenas, não entendi a utilidade deste comando.
Pois é... Acabei solucionando com ASize(), então nem vou usar ACopy(). Agora, nem vejo muita utilidade nela, para meu caso. Mas queria entender onde eu estava errando.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Responder