FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour como acumulo los valores de array?
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
como acumulo los valores de array?
Posted: Fri Dec 10, 2021 09:03 PM
Hola.
necesito acumular los valores de una columna de un array y ponerlos en la posicion de otro array, esto no me funciona:
Code (fw): Select all Collapse
      aTotales[ 1 ] := AScan( aDatos, { | o | nAcum := nAcum + o[ 1 ]  } )
      aTotales[ 2 ] := AScan( aDatos, { | o | nAcum := nAcum + o[ 2 ]  } )


en cambio esto si, pero no me gusta como queda codificado.
Code (fw): Select all Collapse
nAcum:=  AScan( aDatos, { | o | nAcum := nAcum + o[ 1 ]  } )
aTotales[1]:= nACum; nAcum:= 0

nAcum:=  AScan( aDatos, { | o | nAcum := nAcum + o[ 2]  } )
aTotales[2]:= nACum; nAcum:= 0
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: como acumulo los calores de array?
Posted: Sat Dec 11, 2021 08:47 AM
goosfancito wrote:Hola.
necesito acumular los valores de una columna de un array y ponerlos en la posicion de otro array, esto no me funciona:
Code (fw): Select all Collapse
      aTotales[ 1 ] := AScan( aDatos, { | o | nAcum := nAcum + o[ 1 ]  } )
      aTotales[ 2 ] := AScan( aDatos, { | o | nAcum := nAcum + o[ 2 ]  } )


Code (fw): Select all Collapse
aTotales[ 1 ] = 0
aTotales[ 2 ] = 0

AEval( aDatos, { | o | aTotales[ 1 ] += o[ 1 ], aTotales[ 2 ] += o[ 2 ]  } )


EMG
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: como acumulo los valores de array?
Posted: Tue Dec 14, 2021 10:05 AM
Al estilo tradicional, más rápido porque no se evalúa ningún codeblock

Code (fw): Select all Collapse
local aTotales := { 0, 0 }
local n := len( aDatos )
local i

for i := 1 to n
    aTotales[ 1 ] += aDatos[ i, 1 ]
    aTotales[ 2 ] += aDatos[ i, 2 ]
next
______________________________________________________________________________

Sevilla - Andalucía
Posts: 9020
Joined: Thu Oct 06, 2005 08:17 PM
Re: como acumulo los valores de array?
Posted: Wed Dec 15, 2021 08:32 PM

Did you make any comparative speed test?

ENG

Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: como acumulo los valores de array?
Posted: Thu Dec 16, 2021 10:39 AM
No con este ejemplo...
Pero si he hecho pruebas en su día.
En funciones críticas yo usaría el método tradicional que propongo. En otras circunstancias sería cuestión de gustos.

Los codeblock al ser un tipo de dato se pueden pasar como parámetros de funciones lo cual le da muchísima potencia a nuestros programas.
Fue una revolución el cambio de la macrocompilación por codeblocks.

En la época en que se creó el tipo de dato CodeBlock había muy pocos lenguajes que lo tuvieran... desde hace relativamente poco tiempo otros lenguajes lo han incorporado con el nombre de "Closures" o "funciones anónimas".
Pero incluso ahora con el uso de la clase Symbol se pueden hacer cosas muy chulas:
Code (fw): Select all Collapse
PROCEDURE Main()

   LOCAL oSym := Symbol():New( "QOUT" )

   ? "Now test the :Exec() method"

   oSym:Exec( "This string is being printed by QOUT" )
   oSym:Exec( "which is being invoked by the :Exec()" )
   oSym:Exec( "method in the Symbol class." )

   ?
   ? "symbol name: ", oSym:name

   ? "Comparing QOut symbol with xOut symbol"
   ? oSym:IsEqual( Symbol():New( "xOut" ) )

   ? "done!"
   ?

   RETURN


Y el no va mássssssssssss podemos usar punteros a funciones, lo cual va un paso más allá de los codeblocks:

Code (fw): Select all Collapse
procedure main()

    local pFunc := @alert()
    
    pFunc:exec( "Esto es una prueba de puntero a la funcion Alert()" )

    Alert( pFunc:name() ) // Devuelve el nombre de la funcion apuntada
    
    pFunc := @upper()

    pruebaPuntero( pFunc ) // Llama a una funcion pasando un puntero a funcion

 return

 procedure pruebaPuntero( p )

    alert( p:exec( "esto lo veras en mayusculas" ) )

 return


Harbour tiene muchos secretos que lo convierten en un lenguaje super potente y de futuro...
Te imaginas Harbour en la web?

Pues eso es posible con Mod_Harbour!!!
______________________________________________________________________________

Sevilla - Andalucía

Continue the discussion