Página 1 de 1

Como usar a função ACopy()

Enviado: 09 Abr 2019 14:44
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.

Como usar a função ACopy()

Enviado: 09 Abr 2019 16:02
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.

Como usar a função ACopy()

Enviado: 09 Abr 2019 16:22
por gilbertosilverio
Ola Jairo,

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

Não e isso?

Olha o help do Harbour.

Como usar a função ACopy()

Enviado: 09 Abr 2019 17:01
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.

Como usar a função ACopy()

Enviado: 09 Abr 2019 17:09
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

Como usar a função ACopy()

Enviado: 09 Abr 2019 18:09
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 )

Como usar a função ACopy()

Enviado: 09 Abr 2019 18:13
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 */

Como usar a função ACopy()

Enviado: 09 Abr 2019 18:27
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 ) } ) 
   

Como usar a função ACopy()

Enviado: 10 Abr 2019 10:04
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.