como acumulo los valores de array?

Post Reply
User avatar
goosfancito
Posts: 1955
Joined: Fri Oct 07, 2005 7:08 pm

como acumulo los valores de array?

Post by goosfancito »

Hola.
necesito acumular los valores de una columna de un array y ponerlos en la posicion de otro array, esto no me funciona:

Code: Select all | Expand

     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: Select all | Expand

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/
User avatar
Enrico Maria Giordano
Posts: 8753
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Has thanked: 1 time
Been thanked: 4 times
Contact:

Re: como acumulo los calores de array?

Post by Enrico Maria Giordano »

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: Select all | Expand

     aTotales[ 1 ] := AScan( aDatos, { | o | nAcum := nAcum + o[ 1 ]  } )
      aTotales[ 2 ] := AScan( aDatos, { | o | nAcum := nAcum + o[ 2 ]  } )
 


Code: Select all | Expand

aTotales[ 1 ] = 0
aTotales[ 2 ] = 0

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


EMG
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: como acumulo los valores de array?

Post by xmanuel »

Al estilo tradicional, más rápido porque no se evalúa ningún codeblock

Code: Select all | Expand


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
xmanuel
Posts: 768
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Been thanked: 5 times
Contact:

Re: como acumulo los valores de array?

Post by xmanuel »

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: Select all | Expand


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: Select all | Expand



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
Post Reply